Java OutputStream
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();
这个OutputStream
write()
示例首先创建一个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()
JavaOutputStream
的flush()
方法将所有写入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
的更多信息,包括如何设置将字符转换为字节时使用的字符编码。