关闭的BufferedReader的InputStreamReader和(Closing Buffe

2019-06-27 14:19发布

这段代码是创建内存泄漏问题原因的BufferedReader和InputStreamReader的 ,我认为可能会发生一些例外的原因。 我应该如何改变呢?

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){

}

Answer 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);
}


Answer 2:

该代码是不漂亮,但不会产生内存泄漏。 我建议你使用一个内存分析器,以确定所使用的内存是在哪里。 否则,你只是猜测,即使你有在Java中10年以上的经验性能调优;)

更好的选择是使用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();
}


文章来源: Closing BufferedReader and InputStreamReader