【问题标题】:Should I always close BufferedReader?我应该总是关闭 BufferedReader 吗?
【发布时间】:2019-07-20 04:43:38
【问题描述】:

这是将文件读入List的行:

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

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

【问题讨论】:

  • This 似乎暗示 close 是 not 由 collect 调用的。
  • @MS90,你能提供一个链接吗?
  • 对不起,请从我回复的官方文档中往下看。 @叶卡捷琳娜

标签: java bufferedreader


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    嗯,在你的具体例子中,由

    打开的流
    classLoader.getResourceAsStream(fileName)
    

    永远不会关闭。此流必须关闭 - 它很可能是本地系统中的文件句柄。您可以通过关闭BufferedReader 来关闭它,这会关闭包装的InputStreamReader,从而关闭底层的InputStream。相反,您也可以存储对原始 InputStream 的引用并仅关闭它。

    还请查看try-with-resources,这可能会让您在这里更轻松。

    【讨论】:

      【解决方案3】:

      我的立场是正确的


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

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

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

      【讨论】:

        猜你喜欢
        • 2012-12-29
        • 2018-05-01
        • 2013-08-05
        • 2011-09-01
        • 2023-01-06
        • 2012-01-10
        • 2011-01-24
        • 2010-11-05
        • 1970-01-01
        相关资源
        最近更新 更多