共计 1544 个字符,预计需要花费 4 分钟才能阅读完成。
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
,转换时需要指定编码。