Java IO: OutputStream
原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com)
OutputStream类是Java IO API中所有输出流的基类。子类包括BufferedOutputStream,FileOutputStream等等。参考Java IO概述这一小节底部的表格,可以浏览完整的子类的列表。
输出流和目标媒介
输出流往往和某些数据的目标媒介相关联,比如文件,网络连接,管道等。更多细节请参考Java IO概述。当写入到输出流的数据逐渐输出完毕时,目标媒介是所有数据的归属地。
Write(byte)
write(byte)方法用于把单个字节写入到输出流中。OutputStream的write(byte)方法将一个包含了待写入数据的int变量作为参数进行写入。只有int类型的第一个字节会被写入,其余位会被忽略。(译者注:写入低8位,忽略高24位)。
OutputStream的子类可能会包含write()方法的替代方法。比如,DataOutputStream允许你利用writeBoolean(),writeDouble()等方法将基本类型int,long,float,double,boolean等变量写入。
这是一个OutputStream的write()方法例子:
[code lang=”java”]
OutputStream output = new FileOutputStream("c:\\data\\output-text.txt");
while(hasMoreData()) {
int data = getMoreData();
output.write(data);
}
output.close();
[/code]
这个例子首先创建了待写入的FileOutputStream。在进入while循环之后,循环的判断条件是hasMoreData()方法的返回值。hasMoreData()方法的实现不予展示,请把这个函数理解为:当有剩余可写数据时,返回true,否则返回false。
请注意,为了清晰,这里忽略了必要的异常处理。想了解更多异常处理的信息,请参考Java IO异常处理。
write(byte[])
OutputStream同样包含了将字节数据中全部或者部分数据写入到输出流中的方法,分别是write(byte[])和write(byte[], int offset, int length)。
write(byte[])把字节数组中所有数据写入到输出流中。
write(byte[], int offset, int length)把字节数据中从offset位置开始,length个字节的数据写入到输出流。
flush()
OutputStream的flush()方法将所有写入到OutputStream的数据冲刷到相应的目标媒介中。比如,如果输出流是FileOutputStream,那么写入到其中的数据可能并没有真正写入到磁盘中。即使所有数据都写入到了FileOutputStream,这些数据还是有可能保留在内存的缓冲区中。通过调用flush()方法,可以把缓冲区内的数据刷新到磁盘(或者网络,以及其他任何形式的目标媒介)中。
close()
当你结束数据写入时,需要关闭OutputStream。通过调用close()可以达到这一点。因为OutputStream的各种write()方法可能会抛出IO异常,所以你需要把调用close()的关闭操作方在finally块中执行。这是一个OutputStream调用close()的例子:
[code lang=”java”]
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();
}
}
[/code]
这个例子在finally块中调用close()方法。虽然这种方式可以确保OutputStream关闭,但却不是一个完美的异常处理方案。我在Java IO异常处理这文章中更加详细地探讨了IO的异常处理。
原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java IO: OutputStream
“OutputStream的write(byte)方法将一个包含了待写入数据的int变量作为参数进行写入。只有int类型的第一个字节会被写入,其余位会被忽略。”
那int变量的其余24位呢?是接下来三次write()写完,还是直接丢弃了这些位?
Hi,不好意思才看到评论。
我自己做了一个demo
os = new FileOutputStream(“test.txt”);
InputStream is = new FileInputStream(“test.txt”);
os.write(70);
os.write(71);
//os.write(326);
//os.write(327);
int data = 0;
data = is.read();
while(data != -1) {
System.out.println((char) data);
data = is.read();
}
326和70相差256,327与71也相差256。326和327,两个数除了低8为bit有数据之外,从右往左数第9位bit也有数据。
然而写入326与70时读取的结果一样,写入327与71时读取的结果一样,都是F和G,只有2个字符。也即,写入326时,高于低8位的数据不会被保留到接下来的写入中,同时不会影响到327的写入(同样,327的高位会被丢弃,效果与写入71一致)。
结论是,高位直接被丢弃。
write(byte)方法中,【只有int类型的第一个字节会被写入,其余位会被忽略。】这句话怎么理解?没太看明白。