Estou no processo de aprender Java e não consigo encontrar nenhuma boa explicação sobre implements Closeable
as implements AutoCloseable
interfaces e.
Quando implementei um interface Closeable
, meu Eclipse IDE criou um método public void close() throws IOException
.
Eu posso fechar o fluxo usando pw.close();
sem a interface. Mas não consigo entender como implementar o close()
método usando a interface. E qual é o objetivo dessa interface?
Também gostaria de saber: como posso verificar se IOstream
foi realmente fechado?
Eu estava usando o código básico abaixo
import java.io.*;
public class IOtest implements AutoCloseable {
public static void main(String[] args) throws IOException {
File file = new File("C:\\test.txt");
PrintWriter pw = new PrintWriter(file);
System.out.println("file has been created");
pw.println("file has been created");
}
@Override
public void close() throws IOException {
}
Respostas:
Parece-me que você não está muito familiarizado com interfaces. No código que você postou, você não precisa implementar
AutoCloseable
.Você só precisa (ou deve) implementar
Closeable
ouAutoCloseable
se está prestes a implementar o seu próprioPrintWriter
, que lida com arquivos ou quaisquer outros recursos que precisam ser fechados.Na sua implementação, basta ligar
pw.close()
. Você deve fazer isso em um bloco finalmente:O código acima está relacionado ao Java 6. No Java 7, isso pode ser feito de maneira mais elegante (consulte esta resposta ).
fonte
PrintWriter
? EspecialmenteAutoClosable
os objetos podem ser usados em muitas circunstâncias mais do que apenasPrintWriter
s ...PrintWriter
então eu mencionei que era mais específico.AutoCloseable
? Melhor mostrar umatry-with-resources
vez…AutoCloseable
(introduzido no Java 7) torna possível usar o idioma try-with-resources :Agora você pode dizer:
e a JVM ligará
close()
automaticamente para você.Closeable
é uma interface mais antiga.Por algum motivoPara preservar a compatibilidade com versões anteriores, os designers de idiomas decidiram criar um separado. Isso permite que não apenas todas asCloseable
classes (como lançamento de fluxosIOException
) sejam usadas no try-with-resources, mas também permite lançar exceções verificadas mais geraisclose()
.Em caso de dúvida, use
AutoCloseable
, os usuários de sua classe ficarão agradecidos.fonte
Closeable.close()
jogaIOException
. Um monte declose()
métodos que poderiam se beneficiar de try-com-recursos lançar outras exceções verificadas (por exemplo,java.sql.Connection.close()
por issoAutoCloseable.close()
jogaException
Alterar o existente.Closeable
Contrato iria quebrar todos os aplicativos existentes / biblioteca contando com o contrato queclose()
só põeIOException
e não todas as exceções (marcado).Closeable.close()
é necessário ser idempotente.AutoCloseable.close()
não é, embora ainda seja fortemente recomendado.public void close( ) throws Exception
- use uma exceção mais específico, se você pode (e..g IOException)Closeable
não garante idempotência. Ele requer idempotência na implementação de um usuário doclose()
método. E seIOException
é mais específico / apropriado depende do caso de uso.Closeable
estendeAutoCloseable
e é dedicado especificamente aos fluxos de IO: lança IOException em vez de Exception e é idempotente, enquanto o AutoCloseable não fornece essa garantia.Tudo isso é explicado no javadoc de ambas as interfaces.
A implementação do AutoCloseable (ou Closeable) permite que uma classe seja usada como um recurso da construção try-with-resources introduzida no Java 7, que permite fechar esses recursos automaticamente no final de um bloco, sem precisar adicionar um bloco final que fecha o recurso explicitamente.
Sua classe não representa um recurso que pode ser fechado e não há absolutamente nenhum sentido em implementar essa interface: um IOTest não pode ser fechado. Nem deveria ser possível instanciar, pois ele não possui nenhum método de instância. Lembre-se de que implementar uma interface significa que existe um relacionamento entre a classe e a interface. Você não tem esse relacionamento aqui.
fonte
Aqui está o pequeno exemplo
Aqui está a saída:
fonte
this.close()
ou algo em código ?, porque ele é chamado automaticamente (só para ter certeza).A
try-with-resources
declaração.O
try-with-resources statement
é umatry
declaração que declara um ou mais recursos. Aresource
é um objeto que deve ser fechado após o término do programa. Otry-with-resources statement
assegura que cada recurso é fechada no final da instrução. Qualquer objeto implementadojava.lang.AutoCloseable
, que inclui todos os objetos implementadosjava.io.Closeable
, pode ser usado como um recurso.O exemplo a seguir lê a primeira linha de um arquivo. Ele usa uma instância de
BufferedReader
para ler dados do arquivo.BufferedReader
é um recurso que deve ser fechado após a conclusão do programa:Neste exemplo, o recurso declarado na instrução try-with-resources é um BufferedReader. A declaração de declaração aparece entre parênteses imediatamente após a palavra-chave try. A classe
BufferedReader
, no Java SE 7 e posterior, implementa a interfacejava.lang.AutoCloseable
. Como aBufferedReader
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 (como resultado do método queBufferedReader.readLine
gera umIOException
).Antes do Java SE 7, você pode usar um
finally
bloco para garantir que um recurso seja fechado, independentemente de a instrução try ser concluída normalmente ou abruptamente. O exemplo a seguir usa umfinally
bloco em vez de umatry-with-resources
instrução:Por favor, consulte os documentos .
fonte
Recentemente, li um livro do Java SE 8 Programmer Guide ii.
Eu encontrei algo sobre a diferença entre
AutoCloseable
vsCloseable
.A
AutoCloseable
interface foi introduzida no Java 7. Antes disso, existia outra interface chamadaCloseable
. Era semelhante ao que os designers de linguagem desejavam, com as seguintes exceções:Closeable
restringe o tipo de exceção lançada paraIOException
.Closeable
requer implementações para ser idempotente.Os designers de idiomas enfatizam a compatibilidade com versões anteriores. Como alterar a interface existente era indesejável, eles criaram uma nova chamada
AutoCloseable
. Essa nova interface é menos rigorosa queCloseable
. Uma vez queCloseable
atende aos requisitos paraAutoCloseable
, começou a implementarAutoCloseable
quando o último foi introduzido.fonte
Closeable
", sugiro dizer "Esta nova interface pode ser usada em contextos mais gerais, onde a exceção lançada durante o fechamento não é necessariamente uma IOException". No universo Java, ser "menos rigoroso" tem uma impressão negativa.