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()方法例子:

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

while(hasMoreData()) {

    int data = getMoreData();

    output.write(data);

}

output.close();

这个例子首先创建了待写入的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()的例子:

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()方法。虽然这种方式可以确保OutputStream关闭,但却不是一个完美的异常处理方案。我在Java IO异常处理这文章中更加详细地探讨了IO的异常处理。

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java IO: OutputStream

李 璟

李 璟

目前就职于深圳金斧子网络科技,关注Java、Python服务端开发
李 璟

Latest posts by 李 璟 (see all)

FavoriteLoading添加本文到我的收藏
  • Trackback are closed
  • Comments (2)
    • fangqiang08
    • 01/23. 2015 5:28pm

    “OutputStream的write(byte)方法将一个包含了待写入数据的int变量作为参数进行写入。只有int类型的第一个字节会被写入,其余位会被忽略。”
    那int变量的其余24位呢?是接下来三次write()写完,还是直接丢弃了这些位?

      • 李 璟
      • 01/26. 2015 8:17pm

      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一致)。
      结论是,高位直接被丢弃。

You must be logged in to post a comment.

return top