IT-Swarm.Net

我是否需要关闭()FileReader和BufferedReader?

我正在使用围绕FileReader的BufferedReader读取本地文件:

BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();

我是否也需要close()FileReader,或者包装器会处理吗?我见过人们这样做的代码:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();

从servlet调用此方法,我想确保不打开任何句柄。.

175
Zilk

没有。.

BufferedReader.close()

关闭流 根据javadoc for BufferedReaderInputStreamReader

以及

FileReader.close()

确实。.

196
Atmocreations

快速,可靠且价格合理的云托管

注册并在30天内获得$50奖金!

正如其他人指出的那样,您只需要关闭外包装。.

BufferedReader reader = new BufferedReader(new FileReader(fileName));

如果BufferedReader构造函数抛出异常(例如OutOfMemoryError),则可能会泄漏文件句柄的可能性非常小。如果您的应用程序处于此状态,那么清理需要多么谨慎可能取决于您不会剥夺操作系统可能要分配给其他程序的资源的重要性。.

如果包装器构造函数可能在Java 5或6中失败,则可以使用 Closeable 接口:

Reader reader = new FileReader(fileName);
Closeable resource = reader;
try {
  BufferedReader buffered = new BufferedReader(reader);
  resource = buffered;
  // TODO: input
} finally {
  resource.close();
}

Java 7代码应该使用 try-with-resources pattern:

try (Reader reader = new FileReader(fileName);
    BufferedReader buffered = new BufferedReader(reader)) {
  // TODO: input
}
93
McDowell

根据BufferedReader源代码,在这种情况下bReader.close调用fReader.close,所以从技术上讲你不必调用后者。.

6
Csaba_H

BufferedReader 的源代码显示关闭BufferedReader时底层是关闭的。.

4
Brian Agnew

检查源代码后,我发现了例子:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);

close()方法 的BufferedReader object会调用抽象的close()方法 读者 最终将调用实现的方法的类 InputStreamReader中 类,然后关闭 的InputStream 宾语。.

所以,只有bReader.close()就足够了。.

3
Anup Verma

我迟到了,但是:

BufferReader.Java:

public BufferedReader(Reader in) {
  this(in, defaultCharBufferSize);
}

(...)

public void close() throws IOException {
    synchronized (lock) {
        if (in == null)
            return;
        try {
            in.close();
        } finally {
            in = null;
            cb = null;
        }
    }
}
0
Дима Гашко

不要 需要关闭包装好的读写器。.

如果您已经查看了文档( Reader.close()Writer.close() ),您会在Reader.close()中看到它说:

关闭流并释放与其关联的所有系统资源。.

这只是说它“释放任何系统资源 关联 与它”。即使它没有确认..它会让你轻松开始更深入地观察。如果你去Writer.close()它只表明它自己关闭了。.

在这种情况下,我们参考 OpenJDK 来看一下源代码。.

在BufferedWriter 第265行 你会看到out.close()。所以它不是自己关闭..它是另一回事。如果你在类中搜索“out”的出现,你会注意到在 第87行的构造函数中out是编写器,类包装它调用另一个构造函数然后将out参数赋给它自己的out变量。 。.

那么......其他人怎么样?您可以在 BufferedReader Line 514BufferedInputStream Line 468InputStreamReader Line 199 中看到类似的代码。其他我不知道,但这应该足以假设他们这样做。.

0
Omar Abdul'Azeez

你只需要关闭bufferedReader,即reader.close(),它就能正常工作。.

0
robust12

从Java 7开始,您可以使用 try-with-resources语句

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

因为BufferedReader实例是在try-with-resource语句中声明的,所以无论try语句是正常还是突然完成,它都将被关闭。所以你不需要在finally语句中自己关闭它。 (嵌套资源语句也是如此)

这是使用资源的重新编写方式,请参阅 documentation 以获取更多详细信息

0
Claudiu