Estoy en el proceso de aprender Java y no puedo encontrar ninguna buena explicación sobre implements Closeable
las implements AutoCloseable
interfaces.
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 IOstream
realmente 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
Closeable
oAutoCloseable
si 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 losAutoClosable
objetos se pueden usar en muchas más circunstancias que soloPrintWriter
s ...PrintWriter
así que lo mencioné para ser más específico.AutoCloseable
? Mejor mostrar untry-with-resources
en 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.Closeable
Es 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 lasCloseable
clases (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()
lanzaException
Cambio de la existente.Closeable
Contrato rompería todas las aplicaciones existentes / biblioteca de confiar en el contrato queclose()
no hace másIOException
y 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)Closeable
No garantiza la idempotencia. Se requiere idempotencia en la implementación de un usuario delclose()
método. Y siIOException
es más específico / apropiado depende del caso de uso.Closeable
se extiendeAutoCloseable
y 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-resources
declaraciónEl
try-with-resources statement
es unatry
declaración que declara uno o más recursos. Aresource
es un objeto que debe cerrarse después de que el programa haya terminado con él. Estotry-with-resources statement
asegura 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
BufferedReader
para leer datos del archivo.BufferedReader
es 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 laBufferedReader
instancia 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.readLine
arroja unIOException
).Antes de Java SE 7, puede usar un
finally
bloque 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 unfinally
bloque en lugar de unatry-with-resources
declaració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
AutoCloseable
vsCloseable
.La
AutoCloseable
interfaz 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:Closeable
restringe el tipo de excepción lanzada aIOException
.Closeable
requiere 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
. ComoCloseable
cumple con los requisitos paraAutoCloseable
, comenzó a implementarseAutoCloseable
cuando 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.