Estoy en el proceso de aprender Java y no puedo encontrar ninguna buena explicación sobre implements Closeablelas implements AutoCloseableinterfaces.
Cuando implementé un interface Closeable, mi IDE de Eclipse creó un método public void close() throws IOException.
Puedo cerrar la transmisión usando pw.close();sin la interfaz. Pero, no puedo entender cómo puedo implementar el close()método usando la interfaz. ¿Y para qué sirve esta interfaz?
También me gustaría saber: ¿cómo puedo verificar si IOstreamrealmente estaba cerrado?
Estaba usando el código básico a continuación
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 {
}

Respuestas:
Me parece que no estás muy familiarizado con las interfaces. En el código que ha publicado, no necesita implementarlo
AutoCloseable.Solo tiene que (o debería) implementar
CloseableoAutoCloseablesi está a punto de implementar uno propioPrintWriter, que maneja archivos o cualquier otro recurso que deba cerrarse.En su implementación, es suficiente llamar
pw.close(). Deberías hacer esto en un bloque finalmente:El código anterior está relacionado con Java 6. En Java 7 esto se puede hacer de manera más elegante (ver esta respuesta ).
fuente
PrintWriter? Especialmente losAutoClosableobjetos se pueden usar en muchas más circunstancias que soloPrintWriters ...PrintWriterasí que lo mencioné para ser más específico.AutoCloseable? Mejor mostrar untry-with-resourcesen su lugar ...AutoCloseable(introducido en Java 7) hace posible utilizar el idioma de prueba con recursos :Ahora puedes decir:
y JVM llamará
close()automáticamente por usted.CloseableEs una interfaz más antigua.Por alguna razónPara preservar la compatibilidad con versiones anteriores, los diseñadores de idiomas decidieron crear uno diferente. Esto permite que no solo se usen todas lasCloseableclases (como el lanzamiento de secuenciasIOException) en try-with-resources, sino que también permite lanzar excepciones comprobadas más generalesclose().En caso de duda, use
AutoCloseable, los usuarios de su clase se lo agradecerán.fuente
Closeable.close()tirosIOException. Una gran cantidad declose()métodos que podrían beneficiarse de try-con-recursos arrojan otras excepciones controladas (por ejemplo,java.sql.Connection.close()por loAutoCloseable.close()lanzaExceptionCambio de la existente.CloseableContrato rompería todas las aplicaciones existentes / biblioteca de confiar en el contrato queclose()no hace másIOExceptiony no todas las excepciones (marcados).Closeable.close()se requiere ser idempotente.AutoCloseable.close()no lo es, aunque todavía es muy recomendable.public void close( ) throws Exception: use una excepción más específica si puede (por ejemplo, IOException)CloseableNo garantiza la idempotencia. Se requiere idempotencia en la implementación de un usuario delclose()método. Y siIOExceptiones más específico / apropiado depende del caso de uso.Closeablese extiendeAutoCloseabley está específicamente dedicado a las secuencias de E / S: arroja IOException en lugar de Exception, y es idempotente, mientras que AutoCloseable no proporciona esta garantía.Todo esto se explica en el javadoc de ambas interfaces.
La implementación de AutoCloseable (o Closeable) permite que una clase se use como un recurso de la construcción de prueba con recursos introducida en Java 7, lo que permite cerrar dichos recursos automáticamente al final de un bloque, sin tener que agregar un bloque finalmente que cierre el recurso explícitamente
Su clase no representa un recurso que se pueda cerrar, y no tiene ningún sentido implementar esta interfaz: un IOTest no se puede cerrar. Ni siquiera debería ser posible instanciarlo, ya que no tiene ningún método de instancia. Recuerde que implementar una interfaz significa que hay una relación is-a entre la clase y la interfaz. No tienes tal relación aquí.
fuente
Aquí está el pequeño ejemplo.
Aquí está la salida:
fuente
this.close()o algo en el código ?, porque se llama automáticamente (solo para estar seguro)La
try-with-resourcesdeclaraciónEl
try-with-resources statementes unatrydeclaración que declara uno o más recursos. Aresourcees un objeto que debe cerrarse después de que el programa haya terminado con él. Estotry-with-resources statementasegura que cada recurso se cierre al final de la declaración. Cualquier objeto que implementejava.lang.AutoCloseable, que incluye todos los objetos que implementanjava.io.Closeable, puede usarse como un recurso.El siguiente ejemplo lee la primera línea de un archivo. Utiliza una instancia de
BufferedReaderpara leer datos del archivo.BufferedReaderes un recurso que debe cerrarse una vez que el programa haya terminado con él:En este ejemplo, el recurso declarado en la instrucción try-with-resources es un BufferedReader. La declaración de declaración aparece entre paréntesis inmediatamente después de la palabra clave try. La clase
BufferedReader, en Java SE 7 y posterior, implementa la interfazjava.lang.AutoCloseable. Debido a que laBufferedReaderinstancia se declara en una declaración try-with-resource, se cerrará independientemente de si la declaración try se completa normalmente o abruptamente (como resultado del método queBufferedReader.readLinearroja unIOException).Antes de Java SE 7, puede usar un
finallybloque para asegurarse de que un recurso esté cerrado independientemente de si la instrucción try se completa de manera normal o abrupta. El siguiente ejemplo usa unfinallybloque en lugar de unatry-with-resourcesdeclaración:Por favor, consulte los documentos .
fuente
Recientemente leí un libro de Java SE 8 Programmer Guide ii.
He encontrado algo acerca de la diferencia entre
AutoCloseablevsCloseable.La
AutoCloseableinterfaz se introdujo en Java 7. Antes de eso, existía otra interfaz llamadaCloseable. Era similar a lo que querían los diseñadores de idiomas, con las siguientes excepciones:Closeablerestringe el tipo de excepción lanzada aIOException.Closeablerequiere implementaciones para ser idempotente.Los diseñadores del lenguaje enfatizan la compatibilidad con versiones anteriores. Como cambiar la interfaz existente no era deseable, crearon una nueva llamada
AutoCloseable. Esta nueva interfaz es menos estricta queCloseable. ComoCloseablecumple con los requisitos paraAutoCloseable, comenzó a implementarseAutoCloseablecuando se introdujo este último.fuente
Closeable", sugiero decir "Esta nueva interfaz se puede usar en contextos más generales, donde la excepción lanzada durante el cierre no es necesariamente una IOException". En el universo Java, ser "menos estricto" tiene un ambiente negativo al respecto.