2012-08-30 35 views
6

这段代码正在创建内存泄漏问题原因BufferedReaderInputStreamReader,我认为这可能会导致一些例外。我应该如何改变它?Closing 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){ 

} 
+1

可能接近移动()逻辑finally块?您确定在阅读(或)关闭连接时没有发生异常? – kosa

+0

曾尝试在catch子句中编写'e.printStackTrace()'来查看抛出的异常吗? –

回答

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); 
} 
+0

我需要关闭InputStreamReader吗?或者它作为缓冲区读取器关闭将创建一个新的对象? –

+4

不需要显式关闭'InputStreamReader',因为当你关闭'BufferedReader'时它会自动关闭。 –

+0

@aetheria,谢谢。无论如何,我需要一个很好的Java流教程。 –

5

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

设置'in = null'绝对没有好处,然后在'finally'块中检查null。只需在构建BufferedReader后立即放入'try'即可。 –

+0

谢谢!我需要关闭InputStreamReader吗? –

+0

@aetheria好点。定影。 –

相关问题