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()毫无意义。

你可能感兴趣的:(每天多吃一厘米)