我应该总是关闭BufferedReader吗?

问题描述 投票:9回答:3

这是一行将文件读入List

List<String> lines =
    new BufferedReader(
        new InputStreamReader(classLoader.getResourceAsStream(fileName)))
            .lines()
            .collect(Collectors.toList());

这是正确的还是我应该将BufferedReader分配给变量以便以后关闭它?

java bufferedreader
3个回答
11
投票

您应该始终关闭资源。对于仅快速使用几个文件的小程序来说,关闭可能不是一个大问题,因为大多数成熟的操作系统会在进程完成时为您关闭文件。但是,一次打开的文件数量通常有限制。整洁很好,所以当你开始编写更大的程序时,你不会达到这些限制。还有其他类型的资源,如网络和串行端口,您可能希望在程序完成后让其他人使用它们,即使它仍在运行。

手动关闭文件的另一种方法是使用try-with-resources语法,这可确保即使出现错误也能正确关闭文件:

List<String> lines;
try(BufferedReader reader = new BufferedReader(
        new InputStreamReader(classLoader.getResourceAsStream(fileName)))) {
    lines = reader.lines().collect(Collectors.toList());
}

6
投票

好吧,在你的具体例子中,流被打开了

classLoader.getResourceAsStream(fileName)

永远不会关闭。必须关闭此流 - 它很可能是本地系统中的文件句柄。你可以通过关闭BufferedReader关闭它,它关闭包裹的InputStreamReader,关闭底层的InputStream。你也可以存储对原始InputStream的引用,只关闭它。

请同时了解try-with-resources,这可能会让您在这里更轻松。


0
投票

我纠正了


从文档:Streams有一个close()方法并实现AutoCloseable接口,但几乎所有的流实例实际上都不需要在使用后关闭。

通常,只有源为IO通道的流(例如BufferedReader.lines)才需要关闭。

大多数流都由集合,数组或生成函数支持,不需要特殊的资源管理。如果流确实需要关闭,则可以在try-with-resources语句中将其声明为资源。

© www.soinside.com 2019 - 2024. All rights reserved.