定义自己的XMLEventReader以实现Closeable接口

时间:2015-08-20 11:52:52

标签: java interface autocloseable

我想在XMLEventReader上使用try-with-resources。

我发现,XMLEventReader只是一个界面,而我从XMLInputFactory.newInstance().createXMLEventReader(stream)获得的对象属于com.sun.xml.internal.stream.XMLEventReaderImpl类。

通常我会扩展该类来实现Closeable。但是我无法访问它(我无法在我的IDE中打开它) 我在网上找到了它的代码。但是我不愿意把它复制到一个新的课堂上,只是为了使它可以关闭。

那么为什么我不能访问该类,以及制作Closeable XMLEventReader的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:1)

这个怎么样:

public class CloseableXmlEventReader implements XMLEventReader, AutoCloseable{

    private final XMLEventReader internal;

    public CloseableXmlEventReader(XMLEventReader internal) {
        this.internal = internal;
    }

    @Override
    public XMLEvent nextEvent() throws XMLStreamException {
        return internal.nextEvent();
    }

    @Override
    public boolean hasNext() {
        return internal.hasNext();
    }

    @Override
    public XMLEvent peek() throws XMLStreamException {
        return internal.peek();
    }

    @Override
    public String getElementText() throws XMLStreamException {
        return internal.getElementText();
    }

    @Override
    public XMLEvent nextTag() throws XMLStreamException {
        return internal.nextTag();
    }

    @Override
    public Object getProperty(String name) throws IllegalArgumentException {
        return internal.getProperty(name);
    }

    @Override
    public void close() throws XMLStreamException {
        internal.close();
    }

    @Override
    public Object next() {
        return internal.next();
    }
}

像这样使用:

try(CloseableXmlEventReader reader = 
        new CloseableXmlEventReader(XMLInputFactory.newInstance().createXMLEventReader(new FileInputStream("test.xml")))) {

} catch (XMLStreamException | FileNotFoundException ex) {
    Logger.getLogger(CloseableXmlEventReader.class.getName()).log(Level.SEVERE, null, ex);
}