Java 我应该按照什么顺序关闭bufferedwriter和filewriter?

Java 我应该按照什么顺序关闭bufferedwriter和filewriter?,java,Java,我知道BufferedWriter.close会自动关闭底层filewriter源。但出于某种原因,我被赋予了一项任务,这项任务要求同时完成这两项任务。到目前为止,我一直是按这个顺序做的 filewriter.close() bufferwriter.close() 我觉得这个命令是正确的。但另一方面, bufferedwriter.close() filewriter.close() 在这里,它不会抛出一个空指针,因为filewriter已经关闭了吗?正确的顺序是什么?这同样适用于buffer

我知道BufferedWriter.close会自动关闭底层filewriter源。但出于某种原因,我被赋予了一项任务,这项任务要求同时完成这两项任务。到目前为止,我一直是按这个顺序做的

filewriter.close()

bufferwriter.close()

我觉得这个命令是正确的。但另一方面,

bufferedwriter.close()

filewriter.close()

在这里,它不会抛出一个空指针,因为filewriter已经关闭了吗?正确的顺序是什么?这同样适用于bufferedreader和filereader吗

bufferedwriter.close();

filewriter.close();
这不会引发空指针异常。您可能认为这是因为
BufferedWriter
close()
方法将
Writer
字段设置为
null
,但由于Java按值传递对象引用,原始
FileWriter
仍然不是
null
。关闭它不会有任何效果

这是
BufferedWriter#close()
的实现:


OutputStreamWriter.close()
文件编写器继承的文档

关闭流,首先冲洗流。一旦关闭流,进一步的write()或flush()调用将导致抛出IOException。关闭以前关闭的流没有效果

因此,您应该可以很好地关闭已由
BufferedWriter
关闭的
FileWriter


更多信息:

我之所以问这个问题并不是重复的,仅仅是因为我仔细研究了现有的解决方案,没有找到令人满意的答案。我想bufferedreader和filereader也是如此?也只是出于好奇,如果我先关闭filewriter.close(),然后关闭bufferdwriter.close(),会发生什么;它不会有同样的效果吗?@happyHelper同样适用于
BufferedReader
。至于订购差异,我建议您检查一下。
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;
        }
    }
}