关于java中输出流flush()方法

在java开发中,有时我们进行流操作时,会遇到这样的代码:
out.flush();
out.close();
flush()是清空缓存的意思,close()是使流失效,可以被GC回收。原理如下:
flush()这个方法是清空的意思,用来清空缓冲区中的数据流。进行流的操作时,数据先被读到内存中,然后在把数据写到文件中,那么当你数据读完时,我们如果这时调用close()方法关闭读写流,这时就可能造成数据丢失,为什么呢,因为,读入数据完成时不代表写入数据完成,一部分数据可能会留在缓存区中,为了理解这个问题,我们举一个例子:
比如,在农村,几乎每家都有抽水机,抽水机的作用是什么呢,就是把水井里的水抽到水缸中,这时我们就会用水管连接抽水机和水缸(水管就好比是缓冲区),当我们想把水井中的水都抽到水缸中时,我们就让抽水机工作抽水,如果我们发现水井里的水刚好抽完时,我们就会关掉抽水机的开关停止抽水,那么这时,管道里就会遗留一部分水,抽水就是读数据,水缸进水就是写数据,水管充当缓存区的角色,不知道这样是不是具象化了呢
那么这样一来我们如果中途调用close()方法,输出区也还是有数据的,就像水缸里有水,只是在缓冲区遗留了一部分,这时如果我们先调用flush()方法,就会强制把数据输出,缓存区就清空了,最后再关闭读写流调用close()就完成了。

查看outputSteam类,中flush()方法,如下:
public void flush() throws IOException {
}
可以看到flush()方法,并没有做任何的操作。

查看:FilterOutputStream类中flush()方法,如下:
protected OutputStream out;
public void flush() throws IOException {
out.flush();
}
可以看出FilterOutPutStream中flush方法,直接调用了outputStream中的flush方法,意思就是这个flush方法,啥也没有做。

查看BufferedOutPutStream类中flush方法:
public synchronized void flush() throws IOException {
flushBuffer();
out.flush(); //直接调用outputStream的flush方法,清空内存的缓存
}

private void flushBuffer() throws IOException {
if (count > 0) {
out.write(buf, 0, count);
count = 0;
}
}

可以看出flush方法先调用自己类中的flushBuffer()方法,然后调用outputStream的flush方法。

结论:
因为outputStream和FilterOutputStream中的flush()方法,都是调用了outputStream中的flush方法,并且此方法什么事情都没有做。
只有在BufferedOutputStream 中的flush方法调用了flushBuffer方法,我觉得其实只有使用BufferedOutputStream进行流操作的时候,调用 flush()方法,是显示的清空buf[] 数组的数据,outputStream的flush方法是清空内存的缓存。

猜你喜欢

转载自blog.csdn.net/xzj80927/article/details/79802711