Writer
# Writer
Reader
是带编码转换器的 InputStream
,它把 byte
转换为 char
,而 Writer
就是带编码转换器的 OutputStream
,它把 char
转换为 byte
并输出。
# Write 方法
Writer
是所有字符输出流的超类,它提供的方法主要有:
- 写入一个字符(0~65535):
void write(int c)
; - 写入字符数组的所有字符:
void write(char[] c)
; - 写入 String 表示的所有字符:
void write(String s)
。
# FileWriter
FileWriter
就是向文件中写入字符流的 Writer
。它的使用方法和 FileReader
类似:
try (FileWriter writer = new FileWriter("readme.txt")) {
writer.write('H'); // 写入单个字符
writer.write("Hello".toCharArray()); // 写入char[]
writer.write("Wrold"); // 写入String
}
1
2
3
4
5
2
3
4
5
# 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' }
}
1
2
3
4
5
6
2
3
4
5
6
# StringWriter
StringWriter
也是一个基于内存的 Writer
,它和 CharArrayWriter
类似。实际上,StringWriter
在内部维护了一个 StringBuffer
,并对外提供了 Writer
接口。
// display StringWriter
try (StringWriter writer = new StringWriter()) {
writer.write("你好");
System.out.println(writer.toString());//你好
} catch (Exception e) {
e.printStackTrace();
}
1
2
3
4
5
6
7
2
3
4
5
6
7
运行结果:
$ javac IODemo12Writer.java -encoding utf8
$ java IODemo12Writer -encoding utf8
你好
1
2
3
2
3
# OutputStreamWriter
除了 CharArrayWriter
和 StringWriter
外,普通的 Writer 实际上是基于 OutputStream
构造的,它接收 char
,然后在内部自动转换成一个或多个 byte
,并写入 OutputStream
。因此,OutputStreamWriter
就是一个将任意的 OutputStream
转换为 Writer
的转换器:
Writer writer = new OutputStreamWriter(new FileOutputStream("readme.txt")))
1
上述代码实际上就是 FileWriter
的一种实现方式。这和上一节的 InputStreamReader
是一样的。
# 小结
Writer
定义了所有字符输出流的超类:
FileWriter
实现了文件字符流输出;CharArrayWriter
和StringWriter
在内存中模拟一个字符流输出。
Writer
是基于 OutputStream
构造的,可以通过 OutputStreamWriter
将 OutputStream
转换为 Writer
,转换时需要指定编码。
上次更新: 2024/10/1 15:49:31