Закрытие 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();
}