我应该总是关闭BufferedReader吗?

时间:2019-02-26 15:26:36

标签: java bufferedreader

这是一行将文件读入List的行:

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

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

3 个答案:

答案 0 :(得分:11)

您应该始终关闭资源。对于只使用几个文件的小型程序而言,关闭可能不是一个大问题,因为大多数成熟的操作系统会在该过程完成后为您关闭文件。但是,通常一次可以打开多少文件是有限制的。保持整洁是个好习惯,这样当您开始编写更大的程序时,您就不会达到这些限制。还有其他类型的资源,例如网络和串行端口,即使您的程序仍在运行,您可能还希望其他人使用它们。

使用try-with-resources语法可以手动关闭文件,这可以确保即使出现错误也可以正确关闭文件:

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

答案 1 :(得分:6)

在您的具体示例中,

打开的流
classLoader.getResourceAsStream(fileName)

从不关闭。 必须关闭此流-它很可能是本地系统中的文件句柄。您可以通过关闭BufferedReader来关闭它,而InputStreamReader会关闭包装的InputStream,后者会关闭基础的InputStream。相反,您也可以存储对原始{{1}}的引用,然后仅将其关闭。

也请查看try-with-resources,这可能会使您在这里变得更容易。

答案 2 :(得分:0)

我站得住脚


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

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

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