14. Java IO: OutputStream
想要查看此教程的目录请点击:Java IO教程目录贴地址
Java IO API中,OutputStream是所有输出流的基类。子类包括BufferedOutputStream,FileOutputStream等等。想要了解所有的流相关的清单,请看“Java IO Overview”章节
OutputStream介绍和数据目的地
OutputStream经常用来连接到数据目的地,比如文件,网络连接,管道等等。OutputStream将所有数据的数据写入目的地后即结束。
write(byte)
write(byte)方法用来向流中写入单个字节。参数为int类型,也就是准备写出的数据。只有int值的第一个字节会被写入。其余的都会被忽略。
OutputStream的子类可以有更多write()方法。例如,DataOutputStream可以写java基础类型如int,long,float,double,boolean等。相对应的方法writeBoolean(),writeDouble()等
下面是OutputStream的write()例子:
OutputStream output = new FileOutputStream("c:\\data\\output-text.txt");
while(hasMoreData()) {
int data = getMoreData();
output.write(data);
}
output.close();
这个例子首先创建了一个FileOutputStream去获取要读的数据文件。然后进入一个循环,循环的条件是有数据,这只是一个伪代码,并没有去展示怎么确定有数据。
在循环里,调用了方法getMoreData()去获取下一次要往OutputStream写的数据,然后写入数据。
write(byte[])
OutputStream也有write(byte[] bytes)方法和write(byte[] bytes, int offset, int length)方法,这两个都是写入一个或部分数组内的字节到OutputStream。
write(byte[] bytes)方法是将数组内所有数据写入到OutputStream。而write(byte[] bytes, int offset, int length)可以规定从哪里开始写,一共写多少长度的数据。
flush()
OutputStream的flush()方法刷新所有已经写入OutputStream的数据到数据目的地。例如,如果OutputStream是一个FileOutputStream的话,写入FileOutputStream的的字节可能并没有全部被写入到磁盘,他们可能在内存缓冲区里,虽然你的Java代码已经将数据写入到FileOutputStream,但是通过flush()方法,你可以确保数据都已经写到磁盘(网络连接或其他的数据目标地)
close()
当你往OutputStream写完数据的时候你会去关闭掉流,那么就要利用close()方法。由于OutputStream各式的写入方法可能会抛出IOException,那么你就要在finally代码块中来关闭流。下面是一个关闭流的例子:
OutputStream output = null;
try{
output = new FileOutputStream("c:\\data\\output-text.txt");
while(hasMoreData()) {
int data = getMoreData();
output.write(data);
}
} finally {
if(output != null) {
output.close();
}
}
这个例子是在finally中调用close()方法,确保流被关闭。但是它依然没有完美解决异常问题。但是我已经在“Java IO异常处理”章节说明了这个问题的解决办法。