首先說明下字節流和字符流:
FileReader,FileWriter 是讀字符的,1個字符是2個字節,16位
OutputStream ,InputStream是讀字節的,1個字節是8位
如果要讀漢字,一個漢字是2個字節,用InputStream讀就把漢字折成兩半,不太適合吧。
字符流主要讀文本效率比較高。
字節流主要讀二進制文件,圖片 ,音頻,視頻等,就是為了防止出現讀取的單位放大,出現無法還原本程序的目的
如果把文件按字節讀取,然后按照UTF-8的格式編碼顯示,怎么辦?
InputStreamReader就有這功能,對原字節再編碼的過程。
-----------------------------------------------------------------------------------
下面切入正題:
轉換流:InputStreamReader和OutputStreamWriter
一。InputStreamReader 是字符流Reader的子類,是字節流通向字符流的橋梁。你可以在構造器重指定編碼的方式,如果不指定的話將采用底層操作系統的默認編碼方式,例如 GBK 等
要啟用從字節到字符的有效轉換,可以提前從底層流讀取更多的字節,使其超過滿足當前讀取操作所需的字節。
為了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
二。OutputStreamWriter 是字符流Writer的子類,是字符流通向字節流的橋梁。
每次調用 write() 方法都會導致在給定字符(或字符集)上調用編碼轉換器。在寫入底層輸出流之前,得到的這些字節將在緩沖區中累積
為了獲得最高效率,可考慮將 OutputStreamWriter 包裝到 BufferedWriter 中,以避免頻繁調用轉換器。例如:
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
------------------------------------------------------------------------------------------
(1)Reader和Writer類(文本字符流讀寫類):提供的對字符流處理的類,它們為抽象類。一般通過其子類來實現。
(2)InputStreamReader(InputStream in) 和OutputStreamWriter(OutputStream out):它們可以使用指定的編碼規范並基於字節流生成對應的字符流。
(3)BufferedReader(InputStreamReader isr, int size) 和 BufferedWriter(OutputStreamWriter osr, int size):
為提高字符流的處理效率,可以采用緩沖機制的流實現對字符流作成批的處理,避免了頻繁的從物理設備中讀取信息 。
示例一:
package com.zlc.io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class StreamReaderWriterDemo { public static void main(String[] args) { try { //1.從文本文件中獲得輸入字節到字節輸入流中 FileInputStream fis = new FileInputStream("f:\\01.txt"); //2. 為FileInputStream加上字符處理功能 InputStreamReader isr = new InputStreamReader(fis); //將字節流轉換成字符流 //3.為了達到最高效率,可要考慮在 BufferedReader內包裝 InputStreamReader BufferedReader bufr = new BufferedReader(isr); //4.創建將數據寫入到文本文件的文件輸出流 FileOutputStream fos = new FileOutputStream("f:\\02.txt"); //5.為FileOutputStream加上字符處理功能 OutputStreamWriter osw = new OutputStreamWriter(fos); //6.為了獲得最高效率,可考慮將 OutputStreamWriter 包裝到 BufferedWriter 中,以避免頻繁調用轉換器 BufferedWriter bufw = new BufferedWriter(osw); int ch = 0; // 以字符方式顯示文件內容 while((ch = bufr.read()) != -1) { System.out.print((char)ch); osw.write(ch); } if(bufr!=null) bufr.close(); if(bufw!=null) bufw.close(); } catch(ArrayIndexOutOfBoundsException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } } }
在通常編碼時,下面的方式更為常用。下面的代碼是對上面進行了簡化。
示例二:
package com.zlc.io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class StreamReaderWriterDemo2 { public static void main(String[] args) { try { BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("f:\\01.txt"))); BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("f:\\02.txt"))); int ch = 0; // 以字符方式顯示文件內容 while((ch = bufr.read()) != -1) { System.out.print((char)ch); bufw.write(ch); } if(bufr!=null) bufr.close(); if(bufw!=null) bufw.close(); } catch(ArrayIndexOutOfBoundsException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } } }