暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

用于关闭流的flush()方法解释

小谢backup 2018-12-16
1519

在java开发中,出现输入输出流的代码会在finally代码块中强制关闭流,所以会有以下代码:

out.flush();

out.close();


我们都知道out.close()是关闭流的意思,但是为什么要加上out.flush()呢?

flush()的作用是将流中的数据给清空到流的出口,避免流中暂存数据导致数据的准确性出错。

为什么呢?因为我们读数据的时候,是先将数据‘运输’到内存中,flush()就是将内存中的数据给清空,不然存留的数据没有被保存就会被丢失。为了理解这个问题,我们举一个例子:

比如,在农村,几乎每家都有抽水机,抽水机的作用是什么呢,就是把水井里的水抽到水缸中,这时我们就会用水管连接抽水机和水缸(水管就好比是内存缓冲区),当我们想把水井中的水都抽到水缸中时,我们就让抽水机工作抽水,如果我们发现水井里的水刚好抽完时,我们就会关掉抽水机的开关停止抽水,那么这时,管道里就会遗留一部分水,抽水就是读数据,水缸进水就是写数据,水管充当缓存区的角色,不知道这样是不是具象化了呢


那么这样一来我们如果中途调用close()方法,输出区也还是有数据的,就像水缸里有水,只是在缓冲区遗留了一部分,这时如果我们先调用flush()方法,就会强制把数据输出,缓存区就清空了,最后再关闭读写流调用close()就完成了。


 public class PrintWriter extends Writer {

    protected Writer out;

/** Checks to make sure that the stream has not been closed */

    private void ensureOpen() throws IOException {

        if (out == null)

            throw new IOException("Stream closed");

    }

 

    /**

     * Flushes the stream.

     * @see #checkError()

     */

    public void flush() {

        try {

            synchronized (lock) {

                ensureOpen();

                out.flush();

            }

        }

        catch (IOException x) {

            trouble = true;

        }

    }

 

}

这是JDK中PrintWriter类提供的flush方法,如上面注释所说,ensureOpen()方法是用于确保该流没有被关闭,如果没有关闭则执行flush方法中的out.flush();。


文章转载自小谢backup,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论