【问题标题】:Closing BufferedReader and InputStreamReader关闭 BufferedReader 和 InputStreamReader
【发布时间】:2012-08-25 07:33:52
【问题描述】:

这段代码造成了BufferedReaderInputStreamReader 的内存泄漏问题,我认为这可能是一些异常的原因。我应该如何改变它?

try{
    URL url = new URL(sMyUrl);
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
    while ((str = in.readLine()) != null) {
        jsonString += str;
    }
    in.close();
}catch(Exception e){

}

【问题讨论】:

  • 可能是移动 close() 逻辑最终阻塞?您确定在读取(或)关闭连接时没有发生异常吗?
  • 是否尝试在您的 catch 子句中写入 e.printStackTrace() 以查看是否抛出异常?

标签: java bufferedreader inputstreamreader


【解决方案1】:

使用try..finally 块关闭您的流会更安全。您也可以使用StringBuilder,因为它是为连接字符串而设计的。您还应该避免捕获Exception 并且什么都不做。此外,您的代码正在连接没有任何换行符的行。这可能不是您想要的,在这种情况下append("\n") 当您阅读每一行时。

这是一个带有这些修改的版本:

StringBuilder json = new StringBuilder();
try {
    URL url = new URL(sMyUrl);
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
    try {
        String str;
        while ((str = in.readLine()) != null) {
            json.append(str).append("\n");
        }
    } finally {
        in.close();
    }
} catch (Exception e) {
    throw new RuntimeException("Failed to read JSON from stream", e);
}

【讨论】:

  • 我需要关闭 InputStreamReader 吗?或者它作为缓冲区阅读器关闭会创建一个新对象?
  • 无需显式关闭InputStreamReader,因为当您关闭BufferedReader时它会自动关闭。
  • @aetheria,谢谢。无论如何,我需要一个好的 Java 流教程。
  • @aetheria 我在一些教程中看到过,资源在关闭前会检查是否为空。但是当我尝试那个时,它要求我将它们封闭在另一个 try catch 块中。这是为什么?在关闭资源之前检查是否为空是必不可少的
  • Kasun,我建议你用一个例子发布一个单独的问题。
【解决方案2】:

代码不是很漂亮,但不会造成内存泄漏。我建议您使用内存分析器来确定您的内存在哪里使用。否则即使你有十多年的 Java 性能调优经验,你也只是在猜测;)

更好的选择是使用 Java 7

URL url = new URL(sMyUrl);
try(BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) {
  while ((str = in.readLine()) != null) {
     jsonString.append(str).append("\n");
  }
}

如果您有 Java 6 或更早版本,则可以使用。

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) {
try {
  while ((str = in.readLine()) != null) {
     jsonString.append(str).append("\n");
  }
} finally {
  in.close();
}

【讨论】:

  • 谢谢!我需要关闭 InputStreamReader 吗?
  • @SoneshDabhi 当您关闭 BufferedReader 时,它会关闭 InputStreamreader,后者会关闭您从 openStream() 等获得的 InputStream。
猜你喜欢
  • 1970-01-01
  • 2015-11-17
  • 2018-05-01
  • 2015-02-24
  • 2015-10-27
  • 1970-01-01
  • 2012-01-02
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多