Необходимо ли закрыть InputStreamReader в BufferedReader

Мы все знаем, что это хорошая привычка закрывать все StreamReaders, которые мы определили в конце кода.

Теперь мы можем видеть, что два Читателя были определены как ниже. BufferedReader и InputStreamReader. BufferedReader был закрыт, но мы не можем закрыть InputStreamReader.

Код JAVA:

BufferedReader in = new BufferedReader(new InputStreamReader(
    connection.getInputStream()));
if (in != null) {
    in.close();
    }

Проблема здесь, если InputStreamReader в скобках должен быть закрыт? Приведет ли такой код к проблеме? Пожалуйста, скажите мне, спасибо ~

2 ответа

Решение

Там нет проблем с этим, на самом деле InputStreamReader документация из Java API делает это.

В этом случае InputStreamReader используется BufferedReader Это означает, что они оба закроются, когда BufferedReaderclose() Функция вызывается так: "Закрывает поток и освобождает любые системные ресурсы, связанные с ним". Как InputStreamReader Также очень четко "связан" с потоком, он тоже будет закрыт.

Когда вы строите BufferedReader используя InputStreamReader таким образом, они действительно являются одним и тем же читателем, а не двумя разными читателями.

Важно закрыть любой ресурс, который вы используете.

in.close закроет BufferedReader, который в свою очередь закроет ресурсы, которые он сам использует т.е. InputStreamReader.

То, что вы делаете, будет закрывать оба из них, при условии, что перед вызовом не произойдет никаких исключений in.close,

Чтобы убедиться, что он закрыт, независимо от того, что использовать try-with-resources он автоматически закроет его для вас, как только ваш блок будет сделан или когда произойдет исключение.

Вы можете сделать это так:

try(BufferedReader in = new BufferedReader(new InputStreamReader(
connection.getInputStream()))){/*code here*/}

Все ресурсы в try() гарантированно будут закрыты.

Другие вопросы по тегам