Estou lendo um arquivo local usando um BufferedReader envolvido em um FileReader:
BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();
Eu preciso close()
do FileReader
bem, ou será que a alça de invólucro que? Eu vi código em que as pessoas fazem algo assim:
FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();
Esse método é chamado de um servlet e eu gostaria de ter certeza de não deixar nenhum identificador aberto.
java
io
bufferedreader
filereader
Zilk
fonte
fonte
Respostas:
não.
fecha o fluxo de acordo com o javadoc para BufferedReader e InputStreamReader
assim como
faz.
fonte
BufferedReader
lance uma exceção. É mais fácil fechar o fluxo subjacente, embora você precise se preocupar com decoradores com outros recursos e buffer.BufferedReader.close()
fecha o leitor subjacente. Sua descrição é simplesmente copiadaReader.close()
. Este pode ser o comportamento real na prática, mas não está documentado.Reader#close()
os javadocs não dizem se a fecha ou não, está envolto no Reader ou não. Tudo o que diz relacionado a isso éCloses the stream and releases any system resources associated with it.
que não é explícito o suficiente para dizer que fecha ou não o recurso. 'Liberar o recurso' pode também estar removendo qualquer referência ao recurso no BufferedReader ... o que significa que o recurso não está fechado.Como outros já apontaram, você só precisa fechar o invólucro externo.
Há uma chance muito pequena de que isso possa vazar um identificador de arquivo se o
BufferedReader
construtor lançar uma exceção (por exemplo,OutOfMemoryError
). Se seu aplicativo estiver nesse estado, o quão cuidadosa sua limpeza deve ser depende de quão crítico é que você não priva o sistema operacional dos recursos que ele deseja alocar para outros programas.O Closeable interface pode ser usada se um construtor de wrapper provavelmente falhar no Java 5 ou 6:
O código Java 7 deve usar o padrão try-with-resources :
fonte
De acordo com a fonte BufferedReader, nesse caso, bReader.close chame fReader.close para que tecnicamente você não precise chamar o último.
fonte
O código fonte do BufferedReader mostra que o subjacente está fechado quando você fecha o BufferedReader.
fonte
Reader#close()
, isso não fornece evidências concretas de que o Oracle JDK, por exemplo, foi implementado em um Moda semelhante.Depois de verificar o código fonte, descobri que, por exemplo:
o método close () no objeto BufferedReader chamaria o método abstrato close () da classe Reader, que chamaria o método implementado na classe InputStreamReader , que então fecha o objeto InputStream .
Portanto, apenas bReader.close () é suficiente.
fonte
A partir do Java 7, você pode usar a instrução try-with-resources
Como a
BufferedReader
instância é declarada em uma instrução try-with-resource, ela será fechada, independentemente de a instrução try ser concluída normalmente ou abruptamente. Portanto, você não precisa fechá-lo nafinally
declaração. (Este também é o caso de instruções de recursos aninhados)Esta é a maneira recomendada de trabalhar com recursos, consulte a documentação para obter informações mais detalhadas
fonte
Você só precisa fechar o bufferedReader, ou seja, reader.close () e ele funcionará bem.
fonte
Estou atrasado, mas:
BufferReader.java:
fonte
Você não precisa fechar o leitor / gravador embrulhado.
Se você deu uma olhada nos documentos (
Reader.close()
,Writer.close()
), verá queReader.close()
ele diz:O que apenas diz que "libera quaisquer recursos do sistema associados a ele". Mesmo que não confirme ... ele dá uma cutucada para começar a olhar mais fundo. e se você for para
Writer.close()
ele, apenas declara que se fecha.Nesses casos, nos referimos ao OpenJDK para dar uma olhada no código fonte.
Na linha 265 do BufferedWriter , você verá
out.close()
. Portanto, não está se fechando .. É outra coisa. Se você procurar ocorrências na classe "out
", notará que no construtor da Linha 87, queout
é o escritor, a classe agrupa onde chama outro construtor e, em seguida, atribuiout
parâmetro à sua própriaout
variável.Então .. E os outros? Você pode ver um código semelhante nas linhas BufferedReader 514 , BufferedInputStream Line 468 e InputStreamReader Line 199 . Outros eu não sei, mas isso deve ser suficiente para supor que eles fazem.
fonte