Java OutputStreamWriter
Java OutputStreamWriter类" java.io.OutputStreamWriter"用于包装Java OutputStream,从而将基于字节的输出流转换为基于字符的" Writer"。 Java OutputStreamWriter也可以包装OutputStream的任何子类。
如果我们需要将字符写入文件(例如编码为),则JavaOutputStreamWriter
很有用。 UTF-8或者UTF-16. 然后可以将字符(char值)写入OutputStreamWriter,它将正确地对其进行编码,并将编码后的字节写入底层的OutputStream。
JavaOutputStreamWriter
是Java Writer类的子类。因此,我们可以在需要"书写器"的任何地方使用" OutputStreamWriter"。
OutputStreamWriter示例
这是一个简单的Java`OutputStreamWriter示例:
OutputStream outputStream = new FileOutputStream("c:\data\output.txt"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); outputStreamWriter.write("Hello World"); outputStreamWriter.close();
注意:为清楚起见,此处已跳过适当的异常处理。要了解有关正确的异常处理的更多信息,请转到Java IO异常处理。
字符编码构造函数
Java OutputStreamWriter还具有其他构造函数,可让我们指定字符集(ISO-Latin1,UTF-8,UTF-16等),以用于将写入的字符转换为写入底层OutputStream的字节。这是一个JavaOutputStreamWriter
示例,显示了这些构造函数之一的用法:
OutputStream outputStream = new FileOutputStream("c:\data\output.txt"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
这个例子创建了一个OutputStreamWriter,它将所有写入的字符转换为UTF-8编码的字符(每个字符一个或者多个字节),并将UTF-8编码的字节写入底层的OutputStream。
write(int)
Java的OutputStreamWriter的write(int)方法将int的低16位作为单个字符写入到OutputStreamWriter所连接的目的地。这是向Java OutputStreamWriter中写入单个字符的示例:
OutputStream outputStream = new FileOutputStream("c:\data\output.txt"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8"); outputStreamWriter.write('A');
write(char[])
Java的OutputStreamWriter还具有write(char [])方法,该方法可以将字符数组写入到OutputStreamWriter所连接的目标位置。 write(char [])方法返回实际写入OutputStreamWriter的字符数。这是将字符数组写入Java OutputStreamWriter的示例:
OutputStream outputStream = new FileOutputStream("c:\data\output.txt"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8"); char[] chars = new char[]{'A','B','C','D','E'}; outputStreamWriter.write(chars);
写入的性能
向Java OutputStreamWriter中写入字符数组比一次写入一个字符要快。高达10倍甚至更高的加速比可能是非常显着的。因此,建议尽可能使用write(char [])方法。
我们获得的确切速度取决于运行Java代码的计算机的基础操作系统和硬件。加速取决于诸如内存速度,硬盘速度和缓冲区大小,或者网卡速度和缓冲区大小之类的问题,具体取决于" OutputStreamWriter"将数据发送至哪个目的地。
通过BufferedWriter进行透明缓冲
通过将其包装在Java BufferedWriter中,可以透明地缓冲写入JavaOutputStreamWriter
的字符。写入" BufferedWriter"的所有字节将首先在" BufferedWriter"的内部字节数组内进行缓冲。当缓冲区已满时,缓冲区立即全部刷新到基础的OutputStreamWriter
。这是将JavaOutputStreamWriter
包装在BufferedWriter
中的示例:
int bufferSize = 8 * 1024; Writer writer = new BufferedWriter( new OutputStreamWriter( new FileOutputStream("c:\data\output-file.txt"), "UTF-8" ), bufferSize );
我们可以在我的BufferedWriter教程中阅读有关BufferedWriter
的更多信息。
通过BufferedOutputStream进行透明缓冲
添加透明写入写入JavaOutputStreamWriter
的字符的另一种方法是,将OutputStream
包装在Java BufferedOutputStream中,然后再将其包装在OutputStreamWriter
中。写入" BufferedOutputStream"的所有字节都将首先在" BufferedOutputStream"的内部字节数组内进行缓冲。当缓冲区已满时,缓冲区立即全部刷新到底层的OutputStream。这是将JavaOutputStreamWriter
与BufferedOutputStream
结合使用的示例:
int bufferSize = 8 * 1024; OutputStreamWriter outputStreamWriter = new OutputStreamWriter( new BufferedOutputStream( new FileOutputStream("c:\data\output-file.txt"), bufferSize ), "UTF-8" );
我们可以在我的BufferedOutputStream教程中阅读有关BufferedOutputStream
的更多信息。
我要使用两种缓冲机制中的哪一种取决于我们自己。也许尝试一下这两个选项,然后看看哪个最适合我们。
flush()
Java OutputStreamWriter的flush()方法将所有写入OutputStreamWriter的数据刷新到基础数据目标。例如,如果OutputStreamWriter是FileWriter,则写入FileWriter的字节可能尚未完全写入磁盘。即使Java代码已将数据写入到FileWriter中,数据也可能会缓存在OS内存中的某个位置。通过调用flush()
,我们可以确保所有缓冲的数据都将被刷新(写入)到磁盘(或者网络,或者其他任何OutputStreamWriter的目标位置)。这是一个通过调用Java的flush()方法刷新写入Java的数据的示例:
outputStreamWriter.flush();
关闭OutputStreamWriter
完成向OutputStreamWriter中的字符写入后,我们应该记住将其关闭。关闭OutputStreamWriter也会关闭OutputStreamWriter正在写入的OutputStream实例。
关闭OutputStreamWriter是通过调用其close()方法来完成的。这是关闭OutputStreamWriter
的样子:
outputStreamWriter.close();
我们还可以使用Java 7中引入的try-with-resources构造。这是如何使用try-with-resources构造使用和关闭OutputStreamWriter
外观的方法:
OutputStream output = new FileOutputStream("data/data.bin"); try(OutputStreamWriter outputStreamWriter = new OutputStreamWriter(output)){ Person person = new Person(); person.name = "Hyman"; person.age = 40; outputStreamWriter.writeObject(person); }
请注意,不再有任何显式的close()
方法调用。 try-with-resources构造可以解决这一问题。
还要注意,第一个FileOutputStream
实例不是在try-with-resources块内创建的。这意味着try-with-resources块不会自动关闭此FileOutputStream实例。但是,当关闭OutputStreamWriter时,它也会同时关闭写入的OutputStream实例,因此当OutputStreamWriter关闭时,FileOutputStream实例也将关闭。