Java OutputStream

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

Java OutputStream类java.io.OutputStream是Java IO API中所有输出流的基类。 OutputStream的子类包括Java BufferedOutputStream和Java FileOutputStream等。要查看输出流的完整列表,请转到Java IO概述页面的底部表格。

Java OutputStream子类

以下是Java OutputStream类的一些知名子类:

  • ByteArrayOutputStream
  • FileOutputStream
  • PipedOutputStream
  • BufferedOutputStream
  • FilterOutputStream
  • DataOutputStream
  • PrintStream
  • ObjectOutputStream

OutputStream和目的地

JavaOutputStream通常连接到Java IO概述中提到的某些数据目标,例如文件,网络连接,管道,内存缓冲区等。这在Java IO概述文本中也有更详细的说明。 OutputStream的数据目的地是所有写入OutputStream的数据最终将终止的位置。

write(byte)

write(byte)方法用于将单个byte写入Java OutputStream。 OutputStream的write()方法采用一个int,该int包含要写入的字节的字节值。仅写入" int"值的第一个字节。其余的将被忽略。

OutputStream的子类可能具有替代的write()方法。例如,DataOutputStream允许我们使用其相应的方法writeBoolean()writeDouble()等编写Java原语,例如int,long,float,double,boolean等。

这是一个OutputStream的write()示例:

OutputStream outputStream = new FileOutputStream("c:\data\output-text.txt");

while(hasMoreData()) {
  int data = getMoreData();
  outputStream.write(data);
}
outputStream.close();

这个OutputStreamwrite()示例首先创建一个FileOutputStream,数据将被写入其中。然后该示例进入" while"循环。退出while循环的条件是方法" hasMoreData()"的返回值。没有显示" hasMoreData()"的实现,但可以想象如果有更多数据要写入,则返回true,否则返回false。

在while循环内,该示例调用方法getMoreData()获取下一个要写入到OutputStream的数据,然后将该数据写入OutputStream。 while循环继续进行,直到hasMoreData()返回false为止。

注意:为清楚起见,此处已跳过适当的异常处理。要了解有关正确的异常处理的更多信息,请转到Java IO异常处理。

write(byte[])

JavaOutputStream必须具有写方法,该方法使我们可以一次将字节数组写入OutputStream中。这些写方法是:

  • write(byte [] bytes)
  • write(byte [] bytes,int offset,int length)

write(byte [] bytes)方法将byte数组中的所有字节写入OutputStream。

write(byte [] bytes,int offset,int length)方法将字节数组中从索引" offset"开始的" length"字节从字节数组写入" OutputStream"。

如果不是整个数组,这两种方法都将返回写入OutputStream的实际字节数,或者可以根据请求写入length字节。

这是使用这两种write方法中的第二种方法将字节数组写入Java OutputStream的示例:

OutputStream outputStream = new FileOutputStream("/usr/home/HymanHyman/output.txt");

byte[] sourceBytes = ... // get source bytes from somewhere.

int bytesWritten = outputStream.write(sourceBytes, 0, sourceBytes.length);

此示例将指示OutputStream尝试将sourceBytes数组中的所有字节写入OutputStream。执行完此代码后," bytesWritten"变量将包含实际写入" OutputStream"的字节数。

写入的性能

将字节数组写入Java OutputStream比一次写入一个字节更快。高达10倍甚至更高的加速比可能是非常显着的。因此,建议尽可能使用write(byte [])方法。

我们获得的确切速度取决于运行Java代码的计算机的基础操作系统和硬件。加速取决于诸如内存速度,硬盘速度和缓冲区大小,或者网卡速度和缓冲区大小之类的问题,具体取决于" OutputStream"将数据发送至哪个目的地。

通过BufferedOutputStream进行透明缓冲

通过将其包装在Java BufferedOutputStream中,可以对写入JavaOutputStream的字节进行透明缓冲。写入" BufferedOutputStream"的所有字节都将首先在" BufferedOutputStream"的内部字节数组内进行缓冲。当缓冲区已满时,缓冲区立即全部刷新到底层的OutputStream。这是将JavaOutputStream包装在BufferedOutputStream中的示例:

int bufferSize = 8 * 1024;

OutputStream outputStream =
    new BufferedOutputStream(
          new FileOutputStream("c:\data\output-file.txt"), bufferSize);

我们可以在我的BufferedOutputStream教程中阅读有关BufferedOutputStream的更多信息。

flush()

JavaOutputStreamflush()方法将所有写入OutputStream的数据刷新到基础数据目的地。例如,如果OutputStream是FileOutputStream,则写入FileOutputStream的字节可能尚未完全写入磁盘。即使Java代码已将数据写入" FileOutputStream",数据也可能会缓存在OS内存中的某个位置。通过调用flush(),可以确保将所有缓冲的数据刷新(写入)到磁盘(或者网络,或者其他任何OutputStream的目标位置)。这是通过调用Java的Output()方法刷新写入Java的数据的示例:

outputStream.flush();

关闭一个OutputStream

一旦完成将数据写入JavaOutputStream,我们就应该关闭它。我们可以通过调用OutputStream的close()方法来关闭它。这是关闭JavaOutputStream的示例:

OutputStream outputStream = new FileOutputStream("c:\data\output-text.txt");

while(hasMoreData()) {
    int data = getMoreData();
    outputStream.write(data);
}
outputStream.close();

省略了hasMoreData()和getMoreData()的具体实现,但是对于理解本示例的原理而言,它们并不是真正重要的。重要的是,一旦" while"循环结束,并且我们完成了向" OutputStream"中写入数据,便会调用其" close()"方法,该方法将关闭" OutputStream"。

上面的示例并不完全可靠。万一write()方法抛出异常,将永远不会调用close()方法。异常将使程序退出上述代码所在的任何方法。

相反,我们应该使用带有资源构造的Java try来关闭OutputStream。这是一个使用try-with-resources构造关闭JavaOutputStream的示例:

try( OutputStream outputStream = new FileOutputStream("c:\data\output-text.txt")) {
    while(hasMoreData()) {
        int data = getMoreData();
        outputStream.write(data);
    }
}

一旦退出了try块,将自动调用OutputStream的close()方法,因为OutputStream被声明在try块的括号内。即使从try块内部抛出异常,在将异常传播到调用堆栈之前,仍会调用close()方法。

将OutputStream转换为Writer

JavaOutputStream是基于字节的流。我们可以使用Java OutputStreamWriter类将" OutputStream"转换为基于字符的" Writer"。这是一个使用OutputStreamWriter将Java OutputStream转换为Writer的示例:

OutputStream outputStream       = new FileOutputStream("c:\data\output.txt");
Writer       outputStreamWriter = new OutputStreamWriter(outputStream);

outputStreamWriter.write("Hello World");

在我的OutputStreamWriter教程中,我们可以阅读有关如何使用OutputStreamWriter的更多信息,包括如何设置将字符转换为字节时使用的字符编码。