1. 字節流、字符流和轉換流之間的關係
(1)字節流:讀取字節到內存或將字節寫入硬盤文件中。
(2)字符流:將字節轉換爲字符(讀入)或將字符轉換爲字節(寫出)。
(3)轉換流:將字節按照指定的編碼格式轉換爲字符(讀入),或將字符按照指定的編碼格式轉換爲字節(寫出),字節(字符)通向字符(字節)的橋樑。
2.說明
上圖中,硬盤中文件1.txt中有文字【你好】,如果編碼格式爲GBK,則存儲的字節個數爲4個,利用字節輸入流FileInputStream將字節讀取到字符流緩衝區,FileReader字符流會依據工作環境IDEA的編碼格式對讀取的字節進行解碼,然後IDEA的編碼格式爲UTF-8,則會出現亂碼。如果使用轉換流InputStreamReader將字節轉換爲字符,該轉換流可以使用默認的編碼或者指定的編碼格式,進而保證解碼的準確性,最終讀入內存。
上圖中,將內存中的【你好】寫出到硬盤文件1.txt中,使用字符輸出流FileWriter時,該字符流會將你好按照IEDA的默認編碼格式UTF-8將字符轉換爲字節,存入緩衝區,之後利用FileOutputStream字節流,將緩衝區內容寫出到文件中,此時文件內容的編碼格式會默認爲UTF-8。如果使用OutputStreamWriter轉換流可以使用指定的編碼格式將字符轉換爲字節,之後利用字節流將字節寫入文件。
3.案例
(1)輸出轉換流案例:
/**
* OutputStreamWriter轉換流
* (1)OutputStreamWriter(OutputStream out);使用默認編碼格式,將字符編碼成字節
* (2)OutputStreamWriter(OutputStream out,String charsetName);使用指定編碼格式,將字符編碼成字節
*/
private static void osw01() throws Exception {
OutputStream os = new FileOutputStream("E:\\kankan\\1.txt");
OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
osw.write("你好");
osw.flush();
osw.close();
}
(2)輸入轉換流案例:
/*
* InputStreamReader轉換流
* (1)InputStreamReader(InputStream in);使用默認的編碼格式,將字節轉換爲字符
* (2)InputStreamReader(InputStream in,String charsetName);使用指定編碼格式,將字節轉換爲字符
*/
private static void isr01() throws IOException {
InputStream is = new FileInputStream("E:\\kankan\\1.txt");
InputStreamReader isr = new InputStreamReader(is,"utf-8");
char[] chs = new char[1024];
int len = 0;
while((len=isr.read(chs))!=-1){
System.out.println(new String(chs,0,len));
}
isr.close();
}