轉換流與其子類之間的區別
發現有如下繼承關係:
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();
}
}
在使用中的注意事項:
在讀取指定的編碼的文件時,一定要指定編碼格式,否則就會發生解碼錯誤,而發生亂碼現象。