【问题标题】:Is there a memory leak when not closing an InputStream? [duplicate]不关闭 InputStream 时是否存在内存泄漏? [复制]
【发布时间】:2013-07-03 07:03:16
【问题描述】:

我的块代码如下:

URL url = new URL("http://abc.com");
HttpURLConnection con = (HttpURLConnection) url.openConnection();

BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream());

StringBuilder sb = new StringBuilder();

String str = null;

while (null != (str = reader.readLine())) {
    sb = sb.append(str);
}

resStr = sb.toString();

reader.close();
con.disconnect();

上面的代码块中有两个我没有关闭的输入流。

第一个是new InputStreamReader(),第二个是con.getInputStream()。我有新的两个输入,但我没有关闭它们。因为这个原因,可能是内存泄漏?

注意:我使用的是 jdk1.7.0_21

【问题讨论】:

  • 由于您已经关闭了reader,因此包装的流将自动关闭。
  • 谢谢@DanielRenshaw。这件事我很清楚。
  • 由于您使用的是 Java 7,因此您应该使用 try-with-resources 构造来确保您的 reader 对象已关闭。目前,如果发生异常,reader 将不会关闭。 IE。 try (BufferedReader reader = new Buff...) { // reading code }

标签: java


【解决方案1】:

总结 cmets:您没有内存泄漏,因为关闭阅读器也会关闭底层流。

当您使用 Java 7 时,您可以使用 try-with-resource 的魔力

URL url = new URL("http://abc.com");
HttpURLConnection con = (HttpURLConnection) url.openConnection();

try (BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));)
{
    StringBuilder sb = new StringBuilder();

    String str = null;

    while (null != (str = reader.readLine()))
        sb = sb.append(str);

    resStr = sb.toString();
}

con.disconnect();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多