OutputStreamWriter介紹&代碼實現和InputStreamReader介紹&代碼實現

java.io.OutputStreamWriter extends Writer

OutputStreamWriter: 是字符流通向位元組流的橋樑:可使用指定的 charset 將要寫入流中的字符編碼成位元組。(編碼:把能看懂的變成看不懂)

繼續自父類的共性成員方法:

  - void write(int c) 寫入單個字符

  - void write(char[] cbuf)寫入字符數組

  - abstract void write(char[] cbuf, int off, int len)寫入字符數組的某一部分,off數組的開始索引,len寫的字符個數

  - void write(String str)寫入字符串

  - void write(String str, int off, int len) 寫入字符串的某一部分,off字符串的開始索引,len寫的字符個數

  - void flush()刷新該流的緩衝

  - void close() 關閉此流,但要先刷新它

構造方法:

  OutputStreamWriter(OutputStream out)創建使用默認字符編碼的 OutputStreamWriter

  OutputStreamWriter(OutputStream out, String charsetName) 創建使用指定字符集的 OutputStreamWriter

  參數:

    OutputStream out:位元組輸出流,可以用來寫轉換之後的位元組到文件中

    String charsetName:指定的編碼表名稱,不區分大小寫,可以是utf-8/UTF-8,gbk/GBK,…不指定默認使用UTF-8

 

使用步驟:

  1.創建OutputStreamWriter對象,構造方法中傳遞位元組輸出流和指定的編碼表名稱

  2.使用OutputStreamWriter對象中的方法write,把字符轉換為位元組存儲緩衝區中(編碼)

  3.使用OutputStreamWriter對象中的方法flush,把內存緩衝區中的位元組刷新到文件中(使用位元組流寫位元組的過程)

  4.釋放資源

public class Demo02OutputStreamWriter {
    public static void main(String[] args) throws IOException {
        //write_utf_8();
        write_gbk();
    }
 
    /*
       使用轉換流OutputStreamWriter寫GBK格式的文件
    */
    private static void write_gbk() throws IOException {
        //1.創建OutputStreamWriter對象,構造方法中傳遞位元組輸出流和指定的編碼表名稱
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"),"GBK");
        //2.使用OutputStreamWriter對象中的方法write,把字符轉換為位元組存儲緩衝區中(編碼)
        osw.write("你好");
        //3.使用OutputStreamWriter對象中的方法flush,把內存緩衝區中的位元組刷新到文件中(使用位元組流寫位元組的過程)
        osw.flush();
        //4.釋放資源
        osw.close();
    }
 
    /*
        使用轉換流OutputStreamWriter寫UTF-8格式的文件
     */
    private static void write_utf_8() throws IOException {
        //1.創建OutputStreamWriter對象,構造方法中傳遞位元組輸出流和指定的編碼表名稱
        //OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("10_IO\\utf_8.txt"),"utf-8");
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("utf_8.txt"));//不指定默認使用UTF-8
        //2.使用OutputStreamWriter對象中的方法write,把字符轉換為位元組存儲緩衝區中(編碼)
        osw.write("你好");
        //3.使用OutputStreamWriter對象中的方法flush,把內存緩衝區中的位元組刷新到文件中(使用位元組流寫位元組的過程)
        osw.flush();
        //4.釋放資源
        osw.close();
    }
}

java.io.InputStreamReader extends Reader
InputStreamReader:是位元組流通向字符流的橋樑:它使用指定的 charset 讀取位元組並將其解碼為字符。(解碼:把看不懂的變成能看懂的)

繼承自父類的共性成員方法:

  int read() 讀取單個字符並返回

  int read(char[] cbuf)一次讀取多個字符,將字符讀入數組

  void close() 關閉該流並釋放與之關聯的所有資源

構造方法:

  InputStreamReader(InputStream in) 創建一個使用默認字符集的 InputStreamReader

  InputStreamReader(InputStream in, String charsetName) 創建使用指定字符集的 InputStreamReader

  參數:

    InputStream in:位元組輸入流,用來讀取文件中保存的位元組

    String charsetName:指定的編碼表名稱,不區分大小寫,可以是utf-8/UTF-8,gbk/GBK,…不指定默認使用UTF-8

使用步驟:

  1.創建InputStreamReader對象,構造方法中傳遞位元組輸入流和指定的編碼表名稱

  2.使用InputStreamReader對象中的方法read讀取文件

  3.釋放資源

注意事項:

  構造方法中指定的編碼表名稱要和文件的編碼相同,否則會發生亂碼

public class Demo03InputStreamReader {
    public static void main(String[] args) throws IOException {
        //read_utf_8();
        read_gbk();
    }
 
 
    /*
        使用InputStreamReader讀取GBK格式的文件
     */
    private static void read_gbk() throws IOException {
        //1.創建InputStreamReader對象,構造方法中傳遞位元組輸入流和指定的編碼表名稱
        //InputStreamReader isr = new InputStreamReader(new FileInputStream("10_IO\\gbk.txt"),"UTF-8");//???
        InputStreamReader isr = new InputStreamReader(new FileInputStream("gbk.txt"),"GBK");//你好
 
        //2.使用InputStreamReader對象中的方法read讀取文件
        int len = 0;
        while((len = isr.read())!=-1){
            System.out.println((char)len);
        }
        //3.釋放資源
        isr.close();
    }
 
    /*
        使用InputStreamReader讀取UTF-8格式的文件
     */
    private static void read_utf_8() throws IOException {
        //1.創建InputStreamReader對象,構造方法中傳遞位元組輸入流和指定的編碼表名稱
        //InputStreamReader isr = new InputStreamReader(new FileInputStream("10_IO\\utf_8.txt"),"UTF-8");
        InputStreamReader isr = new InputStreamReader(new FileInputStream("utf_8.txt"));//不指定默認使用UTF-8
        //2.使用InputStreamReader對象中的方法read讀取文件
        int len = 0;
        while((len = isr.read())!=-1){
            System.out.println((char)len);
        }
        //3.釋放資源
        isr.close();
    }
}