11

このコードは、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){

}
4

2 に答える 2

17

try..finallyブロックを使用してストリームを閉じる方が安全です。StringBuilder文字列を連結するために設計されているため、 a を使用することもできます。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);
}
于 2012-08-30T14:31:54.253 に答える
12

コードはきれいではありませんが、メモリ リークは発生しません。メモリ プロファイラーを使用して、メモリが使用されている場所を特定することをお勧めします。それ以外の場合は、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();
}
于 2012-08-30T14:27:58.410 に答える