Должен ли я закрывать потоки, созданные с помощью java.НИО.файл.Файлы.ньюинпутстрим?


В учебнике по потокам ничего не говорится о закрытии потоков, полученных из Files.newInputStream( path ). Только некоторые неясные:

Является ли возвращаемый поток асинхронно закрываемым и / или прерываемый является очень специфичным поставщиком файловой системы и поэтому не указан.

Что такое "асинхронно" в этом контексте? Если я закрою поток явно или если другой поток закроет поток асинхронно?

2 4

2 ответа:

Вы обязательно должны закрыть полученный InputStream, как и все остальные. Термин "асинхронно закрываемый" относится к способности закрыть поток, в то время как другой поток блокируется на операции ввода-вывода в нем.

От InterruptibleChannel документация:

Канал, реализующий этот интерфейс, являетсяасинхронно закрываемым : Если поток блокируется в операции ввода-вывода на прерываемом канале, то другой поток может вызвать метод закрытия канала. Этот вызовет блокированный поток для получения AsynchronousCloseException.

Вы можете сделать это удобно с помощью новой опции try with resources.

try(/*initialize resources here*/)
{
}

Они будут автоматически закрыты после блока try. Добавьте улов по мере необходимости.