Потоки закрываются автоматически при ошибке? - PullRequest
5 голосов
/ 20 января 2012

Привет всем, я понимаю, что если мы читаем байты из InputStream и мы закончили чтение всех байтов (или мы не собираемся читать до конца потока), мы должны вызвать close () для освобождения системных ресурсов, связанных с потоком.

Теперь мне было интересно, если я прочитал байтов, и он выдает java.io.IOException , я все еще должен вызывать close () для освобождения системных ресурсов, связанных с потоком?

Или это правда, что при ошибках потоки закрываются автоматически, поэтому нам не нужно вызывать close () ?

1 Ответ

6 голосов
/ 20 января 2012

Сама ОС может закрыть потоки и освободить ресурсы, потому что процесс (а именно JVM) завершается, но это не обязано это делать.

Вы всегда должны реализовыватьfinally блок, где вы закрываете его в таких случаях, например, таких как:

InputStream is = null;

try {
    is = new FileInputStream(new File("lolwtf"));
    //read stuff here
} catch (IOException e) {
    System.out.println("omfg, it didn't work");
} finally {
    is.close();
}

Это не гарантированно сработает, если он бросил в первую очередь, но вы, вероятно, захотите закончить вэта точка зрения в любом случае, так как ваш источник данных, возможно, каким-то образом испорчен.Вы можете узнать больше информации об этом, если будете держать провайдера InputStream рядом, например, если бы я сохранил ссылку на объект File в моем примере, я мог бы проверить, существует ли он и т. Д. Через File 'с интерфейсом, но это зависит от вашего конкретного поставщика данных.

Эта тактика становится более полезной с сетевыми сеансами, например, с Hibernate ...

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