Java OutputStreamWriter

时间:2020-01-09 10:36:05  来源:igfitidea点击:

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。这是将JavaOutputStreamWriterBufferedOutputStream结合使用的示例:

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实例也将关闭。