closeable java java-io

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í.