Закрытие BufferedReader и InputStreamReader

этот фрагмент кода создает проблемы с утечкой памяти из-за командой 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){

}

2 ответов


было бы безопаснее закрыть поток с помощью 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);
}

код не очень хорош, но не будет создавать утечку памяти. Я предлагаю вам использовать профилировщик памяти, чтобы определить, где ваша память используется. В противном случае вы просто догадываетесь, даже если у вас есть десять + лет опыта настройки производительности в 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();
}