Java學習83:Writer

Reader是帶編碼轉換器的InputStream,它把byte轉換爲char,而Writer就是帶編碼轉換器的OutputStream,它把char轉換爲byte並輸出。

Writer和OutputStream的區別如下:

OutputStream Writer
字節流,以byte爲單位 字符流,以char爲單位
寫入字節(0~255):void write(int b) 寫入字符(0~65535):void write(int c)
寫入字節數組:void write(byte[] b) 寫入字符數組:void write(char[] c)
無對應方法 寫入String:void write(String s)

Writer是所有字符輸出流的超類,它提供的方法主要有:

  • 寫入一個字符(0~65535):void write(int c);
  • 寫入字符數組的所有字符:void write(char[] c);
  • 寫入String表示的所有字符:void write(String s)。

FileWriter
FileWriter就是向文件中寫入字符流的Writer。它的使用方法和FileReader類似:

try (Writer writer = new FileWriter("readme.txt", StandardCharsets.UTF_8)) {
    writer.write('H'); // 寫入單個字符
    writer.write("Hello".toCharArray()); // 寫入char[]
    writer.write("Hello"); // 寫入String
}

CharArrayWriter
CharArrayWriter可以在內存中創建一個Writer,它的作用實際上是構造一個緩衝區,可以寫入char,最後得到寫入的char[]數組,這和ByteArrayOutputStream非常類似:

try (CharArrayWriter writer = new CharArrayWriter()) {
    writer.write(65);
    writer.write(66);
    writer.write(67);
    char[] data = writer.toCharArray(); // { 'A', 'B', 'C' }
}

StringWriter
StringWriter也是一個基於內存的Writer,它和CharArrayWriter類似。實際上,StringWriter在內部維護了一個StringBuffer,並對外提供了Writer接口。

OutputStreamWriter
除了CharArrayWriter和StringWriter外,普通的Writer實際上是基於OutputStream構造的,它接收char,然後在內部自動轉換成一個或多個byte,並寫入OutputStream。因此,OutputStreamWriter就是一個將任意的OutputStream轉換爲Writer的轉換器:

try (Writer writer = new OutputStreamWriter(new FileOutputStream("readme.txt"), "UTF-8")) {
    // TODO:
}

上述代碼實際上就是FileWriter的一種實現方式。這和上一節的InputStreamReader是一樣的。

小結
Writer定義了所有字符輸出流的超類:

  • FileWriter實現了文件字符流輸出;

  • CharArrayWriter和StringWriter在內存中模擬一個字符流輸出。

使用try (resource)保證Writer正確關閉。

Writer是基於OutputStream構造的,可以通過OutputStreamWriter將OutputStream轉換爲Writer,轉換時需要指定編碼。

謝謝觀看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章