当您没有明确定义流变量时,在java中关闭流?

时间:2012-01-14 17:20:21

标签: java android xml xml-parsing

所以我想用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后我可以显式关闭流吗?

3 个答案:

答案 0 :(得分:4)

你需要关闭它。理想情况下,会有一个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
    }
}

答案 1 :(得分:2)

迟到的答案,但是如果有人仍然想知道这个尝试资源是在API 19(4.4)中为Android添加的,所以如果你使用minSdkVersion 19+你可以使用它代替finally块自动关闭资源更清洁的代码。

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

答案 2 :(得分:1)

大多数软件(无论如何,好的软件)都遵循以下原则:创建流的人负责在使用后关闭它。你有时可能会找到一个软件,当它提供了一个流,当它完成它时关闭它,但是你不能赌它并且它可能不是理想的行为 - 除非在有问题的软件做很多事情的情况下在读取流之后但在返回呼叫者之前工作,这可能不希望保持流打开一段时间。