OutputStreamWriter介紹&程式碼實現和InputStreamReader介紹&程式碼實現

2022-07-09 18:01:56

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();
    }
}