autocloseable java
implementa Closeable o implementa AutoCloseable (5)
Aquí está el pequeño ejemplo
public class TryWithResource {
public static void main(String[] args) {
try (TestMe r = new TestMe()) {
r.generalTest();
} finally {
System.out.println("From Final Block");
}
}
}
public class TestMe implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println(" From Close - AutoCloseable ");
}
public void generalTest() {
System.out.println(" GeneralTest ");
}
}
Estoy en el proceso de aprender Java y no puedo encontrar ninguna buena explicación sobre los implements Closeable
y los implements AutoCloseable
Interfaces implements AutoCloseable
.
Cuando implementé una interface Closeable
, mi Eclipse IDE 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 método close()
usando la interfaz. Y, ¿cuál es el propósito de esta interfaz?
También me gustaría saber: ¿cómo puedo verificar si IOstream
realmente se cerró?
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 {
}
La declaración de try-with-resources
.
La try-with-resources statement
es una declaración try
que declara uno o más recursos. Un resource
es un objeto que debe cerrarse después de que el programa haya terminado. La try-with-resources statement
garantiza que cada recurso se cierre al final de la declaración. Cualquier objeto que implemente java.lang.AutoCloseable
, que incluye todos los objetos que implementan java.io.Closeable
, se puede usar como 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 después de que el programa haya terminado con él:
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}
En este ejemplo, el recurso declarado en la declaración try-with-resources es un BufferedReader. La declaración declarativa aparece entre paréntesis inmediatamente después de la palabra clave try. La clase BufferedReader
, en Java SE 7 y posteriores, implementa la interfaz java.lang.AutoCloseable
. Como la instancia de BufferedReader
se declara en una instrucción try-with-resource, se cerrará independientemente de si la instrucción try se completa de forma normal o abrupta (como resultado del método BufferedReader.readLine
arroja una IOException
).
Antes de Java SE 7, puede usar un bloque finally
para garantizar que un recurso se cierre independientemente de si la instrucción try se completa de forma normal o abrupta. El siguiente ejemplo usa un bloque finally
lugar de una declaración try-with-resources
:
static String readFirstLineFromFileWithFinallyBlock(String path)
throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
}
Por favor, consulte los documentos .
Me parece que no estás muy familiarizado con las interfaces. En el código que ha publicado, no necesita implementar AutoCloseable
.
Solo deberá (o debería) implementar Closeable
o AutoCloseable
si va a implementar un PrintWriter
propio que maneje archivos o cualquier otro recurso que deba cerrarse.
En su implementación, basta con llamar a pw.close()
. Deberías hacer esto en un bloque final:
PrintWriter pw = null;
try {
File file = new File("C://test.txt");
pw = new PrintWriter(file);
} catch (IOException e) {
System.out.println("bad things happen");
} finally {
if (pw != null) {
try {
pw.close();
} catch (IOException e) {
}
}
}
El código anterior está relacionado con Java 6. En Java 7, esto se puede hacer de forma más elegante (ver esta respuesta ).
AutoCloseable
(introducido en Java 7) hace posible usar el modismo try-with-resources:
public class MyResource implements AutoCloseable {
public void close() throws Exception {
System.out.println("Closing!");
}
}
ahora puedes decir:
try(MyResource res = new MyResource()) {
//use res here
}
y JVM llamará a close()
automáticamente. Closeable
es una interfaz más antigua. Por alguna razón Para preservar la compatibilidad con versiones anteriores, los diseñadores de idiomas decidieron crear uno diferente. De esta forma, no solo todas las clases IOException
se pueden close()
como las que arrojan IOException
) se pueden usar en try-with-resources, sino también aquellas que deseen arrojar una excepción verificada más general de close()
.
En caso de duda, use AutoCloseable
, los usuarios de su clase estarán agradecidos.
Closeable
extiende a AutoCloseable
y está específicamente dedicado a las transmisiones IO: lanza IOException en lugar de Exception y es idempotente, mientras que AutoCloseable no ofrece 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 try-with-resources introducida en Java 7, que permite cerrar dichos recursos automáticamente al final de un bloque, sin tener que agregar un bloque finally que se cierra el recurso explícitamente.
Su clase no representa un recurso que se pueda cerrar, y no tiene ningún sentido implementar esta interfaz: no se puede cerrar un IOTest. No debería ser posible instanciarlo, ya que no tiene ningún método de instancia. Recuerde que implementar una interfaz significa que existe una relación is-a entre la clase y la interfaz. No tienes tal relación aquí.