簡體   English   中英

XMLStreamReader沒有關閉打開的xml文件

[英]XMLStreamReader not closing opened xml file

要使用XMLStreamReader我正在初始化它像 -

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

迭代它像 -

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

最后關閉它像 -

reader.close();

這看起來是正常的流程,但我看到一些奇怪的行為。 即使在關閉閱讀器之后,OS也不允許我刪除/移動xml文件,除非我退出java程序。 在Win2k8服務器上運行時,我收到錯誤消息,說java.exe正在使用此xml文件。

所以我有幾個問題 -

  1. 我是否需要明確關閉每個FileReader的關閉?
  2. 如何找出保持此文件句柄處於打開狀態的java代碼路徑。

看看XMLStreamReader的close()文檔,我得到以下內容 - “釋放與此Reader相關的任何資源。此方法不會關閉底層輸入源。”

“底層輸入源”是什么意思? 為什么不被讀者關閉()?

文檔中提到的基礎輸入源正是您應該關閉的內容。 將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

“底層輸入源”是什么意思? 為什么不被讀者關閉()?

您通過XMLInputFactory.createXMLStreamReader使用參數InputStream創建了XMLReader。 這是一個“潛在的輸入源”。 :)因為它在XMLReader之外打開,因此XMLReader不會關閉它。 但是,如果需要,可以將此包裝類用於XMLReader。 只是工作。

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);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM