特色數組
|--是字節流和字符流之間的橋樑函數
|--該流對象能夠對讀取到的字節數據進行指定編碼表的編碼轉換編碼
什麼時候使用spa
|--當字節和字符之間有轉換動做時xml
|--流操做的數據須要進行編碼表的指定時對象
具體對象體現繼承
|--InputStreamReader:字節到字符的橋樑內存
|--OutputStreamWriter:字符到字節的橋樑get
說明it
這兩個流對象是字符流體系中的成員,它們有轉換的做用,而自己又是字符流,
因此在new的時候須要傳入字節流對象。
構造函數
|--InputStreamReader(InputStream)
經過該構造函數初始化,使用的是系統默認的編碼表GBK。
|--InputStreamReader(InputStream,String charset)
經過該構造函數初始化,能夠經過charset參數指定編碼。
|--OutputStreamWriter(OutputStream)
使用的是系統默認的編碼表GBK。
|--OutputStreamWriter(OutputSream,String charset)
經過該構造函數初始化,能夠經過參數charset指定編碼。
操做文件的字符流對象是轉換流的子類
|--Reader
|--InputStreamReader(轉換流)
|--FileReader(文件字符流)
|--Writer
|--OutputStreamWriter(轉換流)
|--FileWriter(文件字符流)
說明
轉換流中的read方法,已經融入了編碼表,在底層調用字節流的
read方法時將獲取的一個或者多個字節數據進行臨時存儲,並去
查指定的編碼表,若是編碼沒有指定,則使用默認編碼表。
既然轉換流已經完成了編碼轉換的動做,對於直接操做的文本文
件的FileReader而言,就不用再從新定義了,只要繼承該轉換
流,獲取其方法,就能夠直接操做文本文件中的字符數據了。
注意
在使用FileReader操做文本數據時,該對象使用的是默認的編碼表,
若是要使用指定的編碼表,必須使用轉換流。
代碼體現
FileReader fr=new FileReader(「test.txt」);
InputStreamReader isr=new InputStreamReader(new
FileInputStreamReader(「test.txt」));
這兩句代碼意義相同,操做test.txt中的數據都是使用了系統默認
的編碼GBK。由於咱們系統默認使用的編碼表是GBK,若是test.txt中
的數據是經過UTF-8形式編碼的,那麼在讀取的時候就須要指定編碼表,
所以轉換流必須使用InputStreamReader isr=new
InputStreamReader(new FileInputStream(「a.txt」),」UTF-8」);
4、流操做的基本規律
|--明確數據源和數據匯(數據目的)
實際上是爲了明確是輸入流仍是輸出流
|--明確操做的數據是不是純文本數據
|--說明
數據源
鍵盤System.in、硬盤、File開頭的流對象、內存(數組)。
數據匯
控制檯System.out、硬盤、File開頭的流對象、內存(數組)。
|--需求
將鍵盤錄入的數據存儲到一個文件中和打印到控制檯
|--數據源System.in
既然是源,使用的就是輸入流,可用的體系有InputStream
、Reader。由於鍵盤錄入進來的必定是純文本數據,因此
可使用專門操做字符數據的Reader。而System.in對應
的流是字節讀取流,因此要將其進行轉換,將字節轉換成字
符便可,因此要使用Reader體系中的InputStreamReader,
若是要提升效率,就使用BufferedReader,代碼如:
BufferedReader bur=new BufferedReader(new
InputStreamReader(Sysem.in));
|--數據匯:一個文件、硬盤
數據匯必定是輸出流,能夠用的體系有OutputStream、
Writer。往文件中存儲的都是文本數據,那麼可使用字符
流較爲方便Writer。由於操做的是一個文件,因此使用Writer
中的FileWriter,同理,要提升效率就要使用BufferedWriter。
代碼如:BufferedWriter bufr=new BufferedWriter(new
FileWriter(「test.txt」));
清單9,將鍵盤錄入的數據存儲到一個文件中和打印到控制檯代碼
private static void test7(){
BufferedReader bur=null;
OutputStreamWriter osw=null;
BufferedWriter bw=null;
try{
//數據源
bur=new BufferedReader(new InputStreamReader(System.in));
//數據匯
osw=new OutputStreamWriter(System.out);
//數據匯,由於數據源用的是系統默認編碼,因此這裏能夠直接使用FileWriter
//不然必須使用OutputStreamWriter轉換流
bw=new BufferedWriter(new FileWriter("D:\\test_target.txt"));
String line=null;
while((line=bur.readLine())!=null){
osw.write(line);
osw.flush();//刷新到控制檯
bw.write(line);
bw.flush();//刷新到文本文件
}
}catch(IOException e){
e.toString();
}finally{
try{
if(osw!=null){
osw.close();
}
if(bur!=null){
bur.close();
}
if(bw!=null){
bw.close();
}
}catch(IOException ex){
ex.toString();
}
}
}
清單9是按照默認編碼表寫入文本文件的,那麼如何按照指定編碼表寫入文件呢?其實也很簡單,將清單9的代碼稍微改一下就能夠了。
清單10代碼
private static void test8(){
BufferedReader bur=null;
BufferedWriter bw=null;
try{
//數據源
bur=new BufferedReader(new InputStreamReader(System.in));
//數據匯,按照指定編碼格式存儲到文本文件
bw=new BufferedWriter(new OutputStreamWriter(new
FileOutputStream("D:\\test_target.txt"),"UTF-8"));
String line=null;
while((line=bur.readLine())!=null){
bw.write(line);
bw.flush();//刷新到文本文件
}
}catch(IOException e){
e.toString();
}finally{
try{
if(bur!=null){
bur.close();
}
if(bw!=null){
bw.close();
}
}catch(IOException ex){
ex.toString();
}
}
}
既然寫入文件時指定了編碼,那麼在讀取的時候就必須指定該編碼才能正確顯示。
清單11,讀取指定編碼表的文件代碼
private static void test9() {
BufferedReader bur = null;
try {
// 注意,這裏讀取的是清單8寫入的文件,
// 清單10用UTF-8編碼格式寫入,
// 因此在構造InputStreamReader時必須指定UTF-8編碼
bur = new BufferedReader(new InputStreamReader(
new FileInputStream("D:\\test_target.txt"), "UTF-8"));
String line = null;
while ((line = bur.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.toString();
} finally {
try {
if (bur != null) {
bur.close();
}
} catch (IOException ex) {
ex.toString();
}
}
}
寫入和讀取都作了,如今還差個複製操做,其實複製文件也很簡單,先讀取文件,再將讀取到的數據寫入文件,不一樣的是,在讀取和寫入時咱們能夠指定編碼表。
清單12代碼
private static void test11() {
BufferedReader bur = null;
BufferedWriter buw = null;
try {
bur = new BufferedReader(new InputStreamReader(
new FileInputStream("D:\\test_target.txt"), "UTF-8"));
buw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("D:\\test_target1.txt"),"UTF-8"));
String line = null;
while ((line = bur.readLine()) != null) {
buw.write(line);
buw.flush();// 刷新到文本文件
}
} catch (IOException e) {
e.toString();
} finally {
try {
if (buw != null) {
buw.close();
}
if (bur != null) {
bur.close();
}
} catch (IOException ex) {
ex.toString();
}
}
}