这段代码正在创建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){
}
答案 0 :(得分:12)
使用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);
}
答案 1 :(得分:8)
代码不漂亮,但不会造成内存泄漏。我建议你使用内存分析器来确定你的内存使用位置。否则,即使您有十年以上的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();
}