out.flush()真的起作用了?

java.io 包中的outputStream 中有一个方法。

    public void flush() throws IOException {
    }

记得在刚开始学java 的时候在用完outputStream之后要先flush 然后close
这是为什么呢。

本以为,如果执行这个jvm会帮我们调用系统刷新系统的输出缓冲区。于是我就测试了一下。

@Test
    public void tests() throws IOException {
        InputStream inputStream=new FileInputStream("E:/test/te.txt");
        FileOutputStream outputStream=new FileOutputStream("E:/test/te2.txt");
        BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(outputStream);
        int len;
        //8192 是buffoutpuStream 默认的值
        byte[] b=new byte[8192];
        while ((len=inputStream.read(b))!=-1){
            bufferedOutputStream.write(b,0,len);
            //bufferedOutputStream.flush();
            outputStream.flush();
        }

    }

我在 outputStream.flush();这里打了断点,执行到这,首先还没有执行这个语句,文件创建出来了但是没有东西,不难理解这个是写到了buffoutputStream 中的buff 中了。当我执行下一步以后,也就是执行了flush() ,再去看还是没有。说明我想多了,就是什么都没执行。

   public synchronized void flush() throws IOException {
        flushBuffer();
        out.flush();
    }

这里有一个小插曲,我在执行bufferedOutputStream.flush();的时候是可以的。我看了一下源码是,调用了flushBuffer() 所以真正起作用的是flushBuffer()。

  private void flushBuffer() throws IOException {
  //这里count 是buff 中现在有效的数据个数
        if (count > 0) {
            out.write(buf, 0, count);
            count = 0;
        }
    }

这里是调用了fileoutpuStream 的write() ;而这里write是调用的本地方法来实现对磁盘的写入的。

private native void write(int b, boolean append) throws IOException;

所以真正起作用的还是一个个字节写入磁盘的write.
总结:如果没有特殊的处理重写 flush()是没有作用的
例如 只是继承了OutputStream的 fileOutputStream.
所以如果这两个类的对象调用flush()毫无意义。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值