【问题标题】:What order should I follow to close the bufferedwriter and filewriter?我应该按照什么顺序关闭缓冲写入器和文件写入器?
【发布时间】:2015-04-03 16:01:18
【问题描述】:

我知道 BufferedWriter.close 会自动关闭底层文件写入器源。但由于某种原因,我被赋予了需要关闭两者的任务。到目前为止我一直按这个顺序做,

filewriter.close();

bufferwriter.close();

我觉得这个顺序是正确的。然而,另一方面,

bufferedwriter.close();

filewriter.close();

在这里,由于文件编写器已经关闭,它不会抛出一个空指针吗?正确的顺序是什么? bufferedreader 和 filereader 也一样吗?

【问题讨论】:

  • 这不是重复我问的唯一原因是因为我确实浏览了现有的解决方案并且找不到满意的答复。

标签: java


【解决方案1】:
bufferedwriter.close();

filewriter.close();

这不会抛出空指针异常。你可能会这么想,因为BufferedWriterclose() 方法将Writer 字段设置为null,但是因为Java 是按值传递对象引用,所以原来的FileWriter 仍然不是null。关闭它不会有任何影响。

这是BufferedWriter#close()的实现:

public void close() throws IOException {
    synchronized (lock) {
        if (out == null) {
            return;
        }
        try {
            flushBuffer();
        } finally {
            out.close();  // this closes the FileWriter
            out = null;   // the original FileWriter passed to the BufferedWriter is still not null after this call
            cb = null;
        }
    }
}

【讨论】:

【解决方案2】:

来自FileWriter 继承的OutputStreamWriter.close() 文档。

关闭流,首先刷新它。关闭流后,进一步的 write() 或 flush() 调用将导致抛出 IOException。关闭之前关闭的流没有任何效果。

因此,您应该可以关闭已被 BufferedWriter 关闭的 FileWriter

更多信息:http://docs.oracle.com/javase/7/docs/api/java/io/OutputStreamWriter.html

【讨论】:

    猜你喜欢
    • 2015-04-10
    • 2013-12-12
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多