2015-08-17 4 views
-2

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

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

код JAVA:

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

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

+0

http://www.vineetmanohar.com/2011/03/java-7-try-with-auto-closable-resources/ – Alon

+6

Если вы посмотрите на [JavaDocs для 'BufferedReader # close'] (http : //docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#close()), вы увидите, что он говорит: «Закрывает поток и освобождает связанные с ним системные ресурсы. поток закрыт, вызовы read(), ready(), mark(), reset() или skip() будут генерировать исключение IOEx. Закрытие ранее закрытого потока не имеет эффекта. "*, что в основном означает, что вызов 'close' на' BufferedReader' закроет любые связанные (дочерние) потоки – MadProgrammer

+3

Этот вопрос обсуждается на [meta] (http://meta.stackoverflow.com/questions/319744/why-was-this-question-deleted) , –

ответ

0

Нет проблем с этим, на самом деле это от Java API.

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

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

2

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

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

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

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

Вы можете сделать это следующим образом:

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

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

+4

Да, но вопрос в том, должен ли OP закрывать 'InputStreamReader' сами ...' try (InputStreamReader is = new InputStreamReader (...); BufferedReader br = new BufferedReader (is)) {...} ' – MadProgrammer

+0

http://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html # close--: Описание скопировано из класса: Reader Закрывает поток и освобождает связанные с ним системные ресурсы –

+0

Благодарим вас за помощь. После проверки об этом я обнаружил, что вы научили меня полезной функции в java 1.7. Все элементы в круглых скобках должны реализовывать java.lang.AutoCloseable. – xialu

Смежные вопросы