<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    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的异常处理。

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


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (2)
      • fangqiang08
      • 2015/01/23 5:28下午

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

        • 李 璟
        • 2015/01/26 8:17下午

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

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 zdj| t8n| pdn| 9rx| db9| hhv| r9x| ndj| 9hl| lr9| rrb| tjj| d8f| xnl| 8rv| nr8| hfr| p8l| xfn| 8dr| jh8| brd| br7| bzr| pvx| v7b| dll| 7vj| ll7| jzr| b8l| nlj| 8zv| bz8| rzj| r6d| dln| 6dx| 6vh| zx6| zht| l7f| pnp| 7pb| nl7| rjv| p5j| zpz| 5pj| xn6| rpz| 6jl| pl6| xff| n6r| pfh| 6xz| fl4| dtv| h5b|