轉換流
在學習字符流(FileReader
、FileWriter
)的時候,其中說如果需要指定編碼和緩沖區大小時,可以在字節流的基礎上,構造一個InputStreamReader或者OutputStreamWriter,這又是什么意思呢?
OutputStreamWriter類
查閱OutputStreamWriter的API介紹,OutputStreamWriter 是字符流通向字節流的橋梁:可使用指定的字符編碼表,將要寫入流中的字符編碼成字節。它的作用的就是,將字符串按照指定的編碼表轉成字節,在使用字節流將這些字節寫出去。
l 代碼演示:
public static void writeCN() throws Exception {
//創建與文件關聯的字節輸出流對象
FileOutputStream fos = new FileOutputStream("c:\\cn8.txt");
//創建可以把字符轉成字節的轉換流對象,並指定utf-8編碼
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
//調用轉換流,把文字寫出去,其實是寫到轉換流的緩沖區中
osw.write("你好");//寫入緩沖區。
osw.close();
}
OutputStreamWriter流對象,它到底如何把字符轉成字節輸出的呢?
其實在OutputStreamWriter流中維護自己的緩沖區,當我們調用OutputStreamWriter對象的write方法時,會拿着字符到指定的碼表中進行查詢,把查到的字符編碼值轉成字節數存放到OutputStreamWriter緩沖區中。然后再調用刷新功能,或者關閉流,或者緩沖區存滿后會把緩沖區中的字節數據使用字節流寫到指定的文件中。
InputStreamReader類
查閱InputStreamReader的API介紹,InputStreamReader 是字節流通向字符流的橋梁:它使用指定的字符編碼表讀取字節並將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平台默認的字符集。
l 代碼演示
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
//演示字節轉字符流的轉換流
readCN();
}
public static void readCN() throws IOException{
//創建讀取文件的字節流對象
InputStream in = new FileInputStream("c:\\cn8.txt");
//創建轉換流對象
//InputStreamReader isr = new InputStreamReader(in);這樣創建對象,會用本地默認碼表讀取,將會發生錯誤解碼的錯誤
InputStreamReader isr = new InputStreamReader(in,"utf-8");
//使用轉換流去讀字節流中的字節
int ch = 0;
while((ch = isr.read())!=-1){
System.out.println((char)ch);
}
//關閉流
isr.close();
}
}
注意:在讀取指定的編碼的文件時,一定要指定編碼格式,否則就會發生解碼錯誤,而發生亂碼現象。
轉換流和子類區別
發現有如下繼承關系:
OutputStreamWriter:
|--FileWriter:
InputStreamReader:
|--FileReader;
父類和子類的功能有什么區別呢?
OutputStreamWriter和InputStreamReader是字符和字節的橋梁:也可以稱之為字符轉換流。字符轉換流原理:字節流+編碼表。
FileWriter和FileReader:作為子類,僅作為操作字符文件的便捷類存在。當操作的字符文件,使用的是默認編碼表時可以不用父類,而直接用子類就完成操作了,簡化了代碼。
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默認字符集。
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。
FileReader fr = new FileReader("a.txt");
這三句代碼的功能是一樣的,其中第三句最為便捷。
注意:一旦要指定其他編碼時,絕對不能用子類,必須使用字符轉換流。什么時候用子類呢?
條件:
1、操作的是文件。2、使用默認編碼。
總結:
字節--->字符 : 看不懂的--->看的懂的。 需要讀。輸入流。 InputStreamReader
字符--->字節 : 看的懂的--->看不懂的。 需要寫。輸出流。 OutputStreamWriter