IO流——轉換流
OutputStreamWriter類 OutputStreamWriter是字元流通向位元組流的橋樑:可使用指定的字元編碼表,將要寫入流中的字元編碼乘位元組。
程式碼演示:
public static void writeCN() throws Exception { //建立與檔案關聯的位元組輸出流物件 FileOutputStream fos = new FileOutputStream("c:\\cn8.txt"); //建立可以把字元轉成位元組的轉換流物件,並指定編碼 OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8"); //呼叫轉換流,把文字寫出去,其實是寫到轉換流的緩衝區中 osw.write("你好");//寫入緩衝區。 osw.close(); }
在OutputStreamWriter流中維護自己的緩衝區,當我們呼叫OutputStreamWriter物件的write方法時,會拿著字元到指定的碼錶中進行查詢,把查到的字元編碼值轉成位元組數存放到OutputStreamWriter緩衝區中。然後再呼叫重新整理功能,或者關閉流,或者緩衝區存滿後會把緩衝區中的位元組資料使用位元組流寫到指定的檔案中。
InputStreamReader類 InputStreamReader是位元組流通向字元流的橋樑:它使用指定的字元編碼表讀取位元組並將其解碼成字元,它使用的字符集可以用名稱指定或顯示給定,或者可以接受平臺默人的字符集。
程式碼演示:
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,"utf-8"); //使用轉換流去讀位元組流中的位元組 int ch = 0; while((ch = isr.read())!=-1){ System.out.println((char)ch); } //關閉流 isr.close(); } }
注意:在讀取指定的編碼檔案時,一定要指定編碼格式,否則會發生解碼錯誤,從而發生亂碼現象。
轉換流和子類的區別
OutputStreamWriter和InputStreamReader是字元和位元組的橋樑,也可以稱之為位元組轉換符。位元組轉換流原理:位元組表+編碼表。
FileWrite和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、使用預設編碼