关闭BufferedReader和InputStreamReader

Pit*_*ger 9 java bufferedreader inputstreamreader

这段代码正在创建BufferedReaderInputStreamReader导致的内存泄漏问题,我认为可能会发生一些异常.我该怎么改变它?

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

}
Run Code Online (Sandbox Code Playgroud)

ᴇʟᴇ*_*ᴀтᴇ 11

使用try..finally块关闭流更安全.您也可以使用a 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 无需显式关闭`InputStreamReader`,因为当你关闭`BufferedReader`时它会自动关闭. (6认同)

Pet*_*rey 10

代码不漂亮,但不会造成内存泄漏.我建议你使用内存分析器来确定你的内存使用位置.否则你只是猜测即使你有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");
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用Java 6或更早版本,则可以使用.

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) {
try {
  while ((str = in.readLine()) != null) {
     jsonString.append(str).append("\n");
  }
} finally {
  in.close();
}
Run Code Online (Sandbox Code Playgroud)