2012-05-10 19 views
8

Esperaba encontrar XMLStreamReader en AutoCloseable en Java 7. Sin embargo, ese no es el caso. ¿Existe alguna razón técnica por la que las interfaces StAX lector/grabador no se hayan (o no se hayan) adaptado para implementar AutoCloseable? Ya tienen métodos cercanos, cuya intención no es diferente del método de cierre de AutoCloseable.Por qué las clases StAX no fueron adaptadas para ARM en Java 7

Respuesta

8

Si se mira de cerca a la close() method of AutoCloseable:

Cierra este recurso, renunciando a cualquier recurso subyacentes. Este método se invoca automáticamente en objetos administrados por la declaración try-with-resources.

O incluso Closeableclose() method:

Cierra esta corriente y libera los recursos del sistema asociados a ella. Si la transmisión ya está cerrada, invocar este método no tiene ningún efecto.

Considerando que el close() method of XMLStreamReader dice:

Libera todos los recursos asociados con este lector. Este método no cierra la fuente de entrada subyacente.

De hecho, la fuente de entrada es manejado por el Reader que implementa la interfaz Closeable. Por lo tanto, es el lector el que puede estar cerca en el try-with-ressource.

Por ejemplo:

XMLInputFactory factory = XMLInputFactory.newInstance(); 
    XMLStreamReader reader = null; 
    try (FileReader fr = new FileReader("file.xml")) { //Will close the FileReader 
     reader = factory.createXMLStreamReader(fr); 
     reader.close(); 
    } 
    catch (XMLStreamException ex) { 
     if(reader!=null)try { 
      reader.close(); 
     } catch (XMLStreamException ex1) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex1); 
     } 
    } 
+0

Personalmente reestructuraría ese código. reader.close() debe estar en un bloque finally en caso de que se produzca una excepción (tu captura solo es para XMLStreamException, pero también podría arrojar una excepción no verificada). También eliminaría la verificación de que el lector es nulo y simplemente jerarquizaría un segundo nivel de try-finally dentro del otro bloque try. – Trejkaz

0

No hay ninguna razón técnica por la que no podrían haber hecho estas cosas AutoCloseable. Me imagino que todo se reduce a la pereza o al tiempo insuficiente buscando métodos llamados close().

Cuestiones relacionadas