2011-05-07 21 views
6

Para utilizar XMLStreamReader estoy inicializándola gustaría -XMLStreamReader no cerrar archivo XML abierto

XMLInputFactory f = XMLInputFactory.newInstance(); 
XMLStreamReader reader = f.createXMLStreamReader(new FileReader(
     "somefile.xml")); 

iteración en que gustaría -

if (reader.hasNext()) { 
    reader.next(); 
    // do something with xml data 
} 

último cierre se siente -

reader.close(); 

Este parece ser un flujo normal, pero estoy viendo un comportamiento extraño. Incluso después de cerrar el lector, el sistema operativo no me permite eliminar/mover el archivo xml a menos que salga del programa java. Cuando se ejecuta en Win2k8-server, recibo un mensaje de error que dice que java.exe está usando este archivo xml.

Así que tengo par de preguntas -

  1. ¿Es necesario cerrar explícitamente el cierre de cada FileReader?
  2. ¿Cómo puedo saber qué ruta de código java es mantener este identificador de archivo abierto.

Buscando en la documentación de XMLStreamReader's close(), obtengo siguiente: "Libera los recursos asociados con este lector. Este método no cierra la fuente de entrada subyacente".

¿Cuál es el significado de "fuente de entrada subyacente"? ¿Por qué no está cerrado por el cierre del lector()?

Respuesta

9

La fuente de entrada subyacente mencionado en el documento es exactamente lo que debe cerrar. Ponga la FileReader en una variable local para poder cerrarlo:

XMLInputFactory f = XMLInputFactory.newInstance(); 
FileReader fr = new FileReader("somefile.xml"); 
XMLStreamReader reader = f.createXMLStreamReader(fr); 

// process xml 

reader.close(); 
fr.close(); 

//suggest using apache commons IOUtils.closeQuietly(fr); this way you 
// don't have to deal with exceptions if you don't want 
+0

La API del método [close()] (http://download.oracle.com/javase/6/docs/api/javax/xml/stream/XMLStreamReader.html#close()) claramente diga que no cierra el objeto _Reader_ subyacente. Tal vez cite la oración de la API en su respuesta. – Progman

+0

Cualquier cosa sobre mi segunda pregunta: ¿cómo puedo averiguar cuál es la ruta del código java que mantiene abierto este identificador de archivo? – siddharth178

1

¿Cuál es el significado de "fuente de entrada subyacente"? ¿Por qué no está cerrado por el cierre del lector()?

Creó XMLReader por XMLInputFactory.createXMLStreamReader con el argumento InputStream o más. Esta es una "fuente de entrada subyacente". :) Debido a que se abrió fuera de XMLReader, XMLReader no lo cerrará. Pero, si lo necesita, puede usar esta clase contenedora para XMLReader. Solo funciona.

import java.io.IOException; 
import java.io.InputStream; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamException; 
import javax.xml.stream.XMLStreamReader; 
import javax.xml.stream.util.StreamReaderDelegate; 

public class XMLFileReader extends StreamReaderDelegate implements AutoCloseable { 
    private final static XMLInputFactory factory = XMLInputFactory.newFactory(); 
    private final Path file; 
    private final InputStream stream; 
    private final XMLStreamReader reader; 

    public XMLFileReader(Path file) throws IOException, XMLStreamException { 
     super(); 
     this.file = file; 
     stream = Files.newInputStream(this.file); 
     reader = factory.createXMLStreamReader(stream); 
     setParent(reader); 
    } 

    @Override 
    public void close() throws XMLStreamException { 
     try { 
      super.close(); 
      stream.close(); 
     } catch (IOException e) { 
      throw new XMLStreamException(file+" : "+e.getMessage(),e); 
     } 
    } 
} 
Cuestiones relacionadas