【问题标题】:How to correctly close BufferedReader如何正确关闭 BufferedReader
【发布时间】:2019-07-20 00:20:08
【问题描述】:

我有这段代码用于读取 JSON 文件:

Gson gson = new Gson();
BufferedReader bufferedReader = null;
try {
    bufferedReader = new BufferedReader(new FileReader(path));
    JsonObject data = gson.fromJson(bufferedReader, JsonObject.class);
    Log.d(TAG, "DATA: " + data.toString());
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (bufferedReader != null) {
        try {
            bufferedReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代码似乎运行良好,但在 logcat 中我收到以下 3 行:

com.example.package W/System: A resource failed to call close. 
com.example.package W/System: A resource failed to call end. 
com.example.package W/System: A resource failed to call close. 

这是正常的还是我做错了什么?非常感谢。

【问题讨论】:

  • 你不能只使用trytry (BufferedReader bufferedReader = new BufferedReader(new FileReader(path))) { ... } 之类的资源来摆脱finally 块吗?在这种情况下,您必须为IOException 添加catch 子句...
  • @fantaghirocco BufferedReader 似乎正在按照source 关闭底层输入。我不确定 OP 的代码是如何关闭东西的。
  • 这里没有证据表明错误来自此代码。使用 try-with-resources 的建议没有任何改变。这只是 OP 已经写的内容的简写。 @deHaar

标签: java android buffer bufferedreader filereader


【解决方案1】:

好的,@deHaar,是对的:

try (BufferedReader bufferedReader = new BufferedReader(new FileReader(path))) {
    JsonObject data = gson.fromJson(bufferedReader, JsonObject.class);
    Log.d(TAG, "DATA: " + data.toString());
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

这样我就不会收到警告。但我不明白为什么。如果有人可以在 cmets 中编写它,我将不胜感激。谢谢。

【讨论】:

  • 这完全等同于你已经写的。显然问题出在其他地方,而您在不知情的情况下解决了它。
  • 好吧,我觉得有些大的改变了,我没有更多的 finally 部分使用 close 方法......
  • 但是您从来没有任何证据表明问题最初来自这里。你写的和你现在写的是100%等价的。这个新代码只是旧代码的简写。
  • @user207421 使用此代码作为证据时不会出现警告这一事实吗?也许,也许不是……但是,它一定与资源管理有关,显然,带有资源的 try 可以改进一些东西,尽管我们并不知道到底是什么。
  • 不。当您阅读 try-with-resources 的规范时,显而易见的是它的执行与您最初编写的代码相同。 Ergo 你改变了其他东西来修复它。
猜你喜欢
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 2017-03-29
  • 2019-04-12
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多