这是一行将文件读入List
的行:
List<String> lines =
new BufferedReader(
new InputStreamReader(classLoader.getResourceAsStream(fileName)))
.lines()
.collect(Collectors.toList());
这是正确的还是应该将BufferedReader
分配给变量以便以后可以将其关闭?
答案 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语句中将其声明为资源。