轉換流與其子類之間的區別

轉換流與其子類之間的區別

發現有如下繼承關係:

Writer 字符輸出流

OutputStreamWriter   轉換流(字符流—>字節流)(屬於字符輸出流, 可以指定字符編碼表,用來寫入數據到文件)

FileWriter 操作文件中字符輸出流,採用默認的字符編碼表

 

Reader 字符輸入流

InputStreamReader: 轉換流(字節流à字符流)(屬於字符輸入流,可以指定字符編碼表,用來從文件中讀數據)

FileReader操作文件中字符輸入流,採用默認的字符編碼表

 

父類和子類的功能有什麼區別呢?

OutputStreamWriter和InputStreamReader是字符和字節的橋樑:也可以稱之爲字符轉換流。字符轉換流原理:字節流+編碼表。

FileWriter和FileReader:作爲子類,僅作爲操作字符文件的便捷類存在。當操作的字符文件,使用的是默認編碼表時可以不用父類,而直接用子類就完成操作了,簡化了代碼。

InputStreamReader isr = newInputStreamReader(new FileInputStream("a.txt"));//默認字符集。

InputStreamReader isr = newInputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。

FileReader fr = newFileReader("a.txt");

這三句代碼的功能是一樣的,其中第三句最爲便捷。

注意:一旦要指定其他編碼時,絕對不能用子類,必須使用字符轉換流。什麼時候用子類呢?

條件:

1、操作的是文件。2、使用默認編碼。

總結:

字節--->編碼表--->字符: 看不懂的--->看的懂的。  需要讀。輸入流。InputStreamReader

字符--->編碼表--->字節: 看的懂的--->看不懂的。  需要寫。輸出流。OutputStreamWriter

舉個例子

現有一字符串:”我愛Java”。將該字符串保存到當前項目根目錄下的a.txt文件中。

要求:使用utf8編碼保存。

      public staticvoid main(String[] args) throws IOException{

           // 要保存的字符串

           String content= "我愛Java";

           // 創建字節輸出流對象

           FileOutputStream fos = new FileOutputStream("a.txt");

           // 創建轉換輸出流對象

           OutputStreamWriter osw = newOutputStreamWriter(fos, "utf8");

           // 調用方法寫出數據

           osw.write(content);

           // 關閉流釋放資源

           osw.close();

      }

}

在使用中的注意事項:

在讀取指定的編碼的文件時,一定要指定編碼格式,否則就會發生解碼錯誤,而發生亂碼現象。

 

 

發佈了56 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章