【问题标题】:Closing streams in java when you don't explicitly define the stream variable?当您没有明确定义流变量时在java中关闭流?
【发布时间】:2012-01-14 17:20:21
【问题描述】:

所以我想知道在 Java 中这是否安全?

HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(new HttpGet(new URI(String)));
XmlPullParser xpp = Util.getXpp(new InputStreamReader(response.getEntity().getContent()));

我没有明确定义 InputStreamReader,这意味着我无法关闭它。不过,我并不特别喜欢这段代码的外观。我这样做的原因是因为我不想等到完成 XML 解析之后才关闭流。

一旦代码超出范围,VM 会自动关闭流吗?我是否应该重构我的代码,以便在完成 XML 解析后显式关闭流?

【问题讨论】:

标签: java android xml xml-parsing


【解决方案1】:

你需要关闭它。理想情况下,会有一个 try / finally 结构,这样即使有异常,流也会关闭。 (或者使用新的 Java 7 try-with-resources 东西)

InputStreamReader reader = null;
try {
   all the stuff that might fail (IOException etc...)
}
finally {
  if (reader != null)
    try {
       reader.close();
    }
    catch (IOExcetpion ioe) {
       ; // this is one of the very few cases it's best to ignore the exception
    }
}

【讨论】:

  • 感谢您的回答,但在您的示例中,您明确定义了流。如果不定义流,它不会自动关闭吗?就像虚拟机应该知道我们显然已经完成了它。我知道我真的在这里伸展,哈哈
  • 除非您使用新的 Java 7 try with resources 功能,否则 VM 不知道要关闭 Stream。它知道如何进行垃圾收集,但不知道如何关闭。因此,您必须在变量中显式定义流,以便您可以自己关闭它。 (是的,这有点烦人,尤其是对于打开许多流的复杂情况)
  • +1 虽然 android 当前不支持 Java 7 功能。所以你总是需要明确地关闭你的流。
  • @LadaRaider - 感谢您的信息。我不确定Android是否支持Java7。我现在正在使用 Java6。
  • 感谢大家的帮助!正是这样的信息才真正使这个网站变得无价。
【解决方案2】:

迟到的答案,但如果有人仍然想知道 API 19 (4.4) 中为 Android 添加了这个 try-with-resources,所以如果您使用 minSdkVersion 19+,您可以使用它而不是 finally 块来自动关闭资源更简洁的代码。

    ...
    try (InputStreamReader reader = new InputStreamReader(response.getEntity().getContent())) {
        ...
    } catch (IOException e) {
        ...
    }

【讨论】:

    【解决方案3】:

    大多数软件(好吧,无论如何都是好软件)遵循的原则是,创建流的人负责在使用后关闭它。您有时可能会发现软件在提供流时会在完成后将其关闭,但您不能打赌,这可能不是可取的行为 - 除非所讨论的软件做了很多在读取流之后但在返回调用者之前工作,可能不希望长时间保持流打开。

    【讨论】:

      猜你喜欢
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 2012-04-16
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多