关闭BufferedReader和InputStreamReader

这段代码正在创建BufferedReader和InputStreamReader导致的内存泄漏问题,我认为可能会发生一些exception。 我该怎么改变它?

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

使用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); } 

代码不漂亮,但不会造成内存泄漏。 我建议你使用内存分析器来确定你的内存使用位置。 否则你只是在猜测,即使你有10年以上的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(); }