Закрытие потоков в Java, если вы не указали явную переменную потока? - PullRequest
1 голос
/ 14 января 2012

Так что мне интересно, в 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.

Будет ли виртуальная машина автоматически закрывать поток, как толькокод выходит за рамки?Должен ли я выполнить рефакторинг своего кода, чтобы можно было явно закрыть поток, как только я закончу анализ XML?

Ответы [ 3 ]

4 голосов
/ 14 января 2012

Вам нужно закрыть его. В идеале, должна быть структура 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
    }
}
2 голосов
/ 17 февраля 2016

Поздний ответ, но в случае, если кто-то все еще задается вопросом об этом try-with-resources, было добавлено для Android в API 19 (4.4), поэтому, если вы используете minSdkVersion 19+, вы можете использовать его вместо блоков finally для автоматически закрываемых ресурсов для более чистого кода.

    ...
    try (InputStreamReader reader = new InputStreamReader(response.getEntity().getContent())) {
        ...
    } catch (IOException e) {
        ...
    }
1 голос
/ 14 января 2012

Большая часть программного обеспечения (в любом случае, хорошее программное обеспечение) следует принципу, согласно которому тот, кто создает поток, отвечает за его закрытие после использования. Иногда вы можете найти программное обеспечение, которое, когда поставляется с потоком, закрывает его, когда он закончил с ним, но вы не можете сделать ставку на него, и это, вероятно, нежелательное поведение - за исключением, возможно, случаев, когда рассматриваемое программное обеспечение делает много работать после чтения потока, но перед возвратом к вызывающей стороне, где сохранение потока открытым в течение длительного периода времени может быть нежелательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...