【问题标题】:BufferedReader is closed when returned from methodBufferedReader 从方法返回时关闭
【发布时间】:2021-02-10 12:14:09
【问题描述】:

我正在编写代码来读取文件并对其进行处理,并且我正在将逻辑拆分为许多小方法。所以我有一个方法来读取文件并返回 BufferedReader 和另一个用返回的 BufferedReader 对象做逻辑。但是当我尝试在第二种方法中从 BufferedReader 对象中读取行时,它给了我 [java.io.IOException: Stream Closed]。

我用来读取文件并返回BufferedReader的方法

private static BufferedReader readFile(String file) {
    try (FileInputStream fileInputStream = new FileInputStream(file)) {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
        System.out.println(bufferedReader.readLine()); // this line is working successfully
        return bufferedReader;
    } catch (FileNotFoundException fileNotFoundException) {
        fileNotFoundException.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

知道为什么会发生这种情况以及如何解决吗?

【问题讨论】:

  • try (FileInputStream fileInputStream = new FileInputStream(file)) - 你觉得这里发生了什么?
  • 你也可以发布异常堆栈吗?

标签: java bufferedreader


【解决方案1】:

您正在使用 try-with-resources:

try (FileInputStream fileInputStream = new FileInputStream(file)) {

这一行正在创建一个FileInputStream,可以在您的try 块中使用。一旦你离开你的try 块,close() 方法就会被调用到流上。因此,如果您返回流或其BufferedReader,则流将已关闭。你不应该使用 try-with-resources 甚至更好,从流而不是流本身返回你需要的任何东西。

【讨论】:

    【解决方案2】:

    显然,这里的问题在于使用try-with-resources和AutoCloseable接口。但是,我想指出您阅读文件的方式是“老式”方式。我们现在有了 Files、Paths 和 Stream 类来方便读取文件。这使用 java NIO,返回一个 Stream 并且总体上更好:

    Files.lines(Paths.get(pathToFile))
    

    此外,这里不需要关闭任何东西

    【讨论】:

      猜你喜欢
      • 2016-07-20
      • 1970-01-01
      • 2013-01-05
      • 2017-10-02
      • 2014-01-30
      • 1970-01-01
      • 2014-11-17
      • 2011-10-31
      • 1970-01-01
      相关资源
      最近更新 更多