2011-05-07 13 views
6

बंद करने XMLStreamReader मैं इसे आरंभ कर रहा हूँ का उपयोग करने के पसंद नहीं - इस परXMLStreamReader खोला xml फ़ाइल

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

पुनरावृत्ति की तरह -

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

अंत में इसे पसंद को बंद -

reader.close(); 

यह एक सामान्य प्रवाह दिखता है लेकिन मुझे कुछ अजीब व्यवहार दिखाई दे रहा है। पाठक को बंद करने के बाद भी, ओएस मुझे जावा प्रोग्राम से बाहर निकलने तक xml फ़ाइल को हटाने/स्थानांतरित करने की अनुमति नहीं देता है। Win2k8-server पर चलाते समय, मुझे त्रुटि संदेश मिलता है कि java.exe इस xml फ़ाइल का उपयोग कर रहा है।

  1. मैं स्पष्ट रूप से प्रत्येक FileReader के करीबी को बंद करने की जरूरत है -

    तो मैं सवालों की जोड़ी है?

  2. मैं जो जावा कोड पथ इस फाइल को खोलने के लिए संभाल रखने है पता कर सकते हैं कैसे।

@ XMLStreamReader के करीबी(), मैं निम्नलिखित मिल के प्रलेखन देख रहे हैं - "इस रीडर के साथ जुड़े किसी भी संसाधनों को मुक्त कर देते इस विधि अंतर्निहित इनपुट स्रोत को बंद नहीं करता है।।"

"इनपुट स्रोत अंतर्निहित" का अर्थ क्या है? क्यों कि पाठक के करीबी द्वारा() बंद नहीं है?

उत्तर

9

दस्तावेज़ में उल्लिखित अंतर्निहित इनपुट स्रोत बिल्कुल वही है जो आपको बंद करना चाहिए। एक स्थानीय चर में FileReader रखो इसे बंद करने में सक्षम हो:

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

स्पष्ट रूप से [करीब()] विधि (http://download.oracle.com/javase/6/docs/api/javax/xml/stream/XMLStreamReader.html#close()) के एपीआई कहें कि यह अंतर्निहित _Reader_ ऑब्जेक्ट को बंद नहीं करता है। शायद आपके उत्तर में एपीआई से वाक्य उद्धृत करें। – Progman

+0

मेरे दूसरे प्रश्न पर कुछ भी - मैं यह कैसे पता लगा सकता हूं कि कौन सा जावा कोड पथ इस फ़ाइल को संभाल रहा है? – siddharth178

1

"इनपुट स्रोत अंतर्निहित" का अर्थ क्या है? पाठक के करीबी() द्वारा बंद क्यों नहीं किया जाता है?

आपने XMLInputFactory.createXMLStreamReader द्वारा XML इनपुटर को तर्क इनपुट स्ट्रीम के साथ बनाया है। यह एक "अंतर्निहित इनपुट स्रोत" है। :) क्योंकि यह XMLReader के बाहर खोला गया है, इस प्रकार XMLReader इसे बंद नहीं करेगा। लेकिन, यदि आपको आवश्यकता है, तो XML रैडर के लिए इस रैपर क्लास का उपयोग कर सकते हैं। बस काम करता है।

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); 
     } 
    } 
} 
संबंधित मुद्दे