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,轉換時需要指定編碼。
謝謝觀看