Warum ist XMLEventReader nicht automatisch schließbar (versuchen Sie es mit Ressourcen)Java

Java-Forum
Guest
 Warum ist XMLEventReader nicht automatisch schließbar (versuchen Sie es mit Ressourcen)

Post by Guest »

Warum ist das so?
Mir ist aufgefallen, dass XMLEventReader eine close()-Methode hat, aber ich konnte den folgenden Code nicht verwenden:

Code: Select all

try (XMLEventReader reader = ...) { ... }
BEARBEITEN
Es stellte sich heraus, dass es viel schlimmer war, als ich erwartet hatte. Ich möchte einen XMLEventReader haben, der AutoClosable ist, um die zugrunde liegende Eingabequelle automatisch zu schließen. Es reicht also nicht aus, AutoCloseable#close an XMLEventReader#close zu delegieren!
Die API (XMLInputFactory und XMLEventReader) war nicht sehr hilfreich für Ich habe es geschafft, es mit nur wenigen Zeilen oder sogar einem Lambda-Ausdruck zu ermöglichen. Ich habe das getan, aber es ist sehr unbefriedigend:

Code: Select all

static class SourceClosingXMLEventReader extends EventReaderDelegate implements AutoCloseable {

private final static XMLInputFactory FACTORY = XMLInputFactory.newInstance();

static SourceClosingXMLEventReader with(StringReader reader) throws XMLStreamException {
return new SourceClosingXMLEventReader(FACTORY.createXMLEventReader(reader), reader);
}

static SourceClosingXMLEventReader with(InputStream stream) throws XMLStreamException {
return new SourceClosingXMLEventReader(FACTORY.createXMLEventReader(stream), stream);
}

private AutoCloseable underlyingInputSource;

SourceClosingXMLEventReader(XMLEventReader originalReader, AutoCloseable underlyingInputSource) {
super(originalReader);
this.underlyingInputSource = underlyingInputSource;
}

/**
* {@link XMLEventReader#close()} does not close underlying resourcesand does not implement
* {@link AutoCloseable}, so this overridden method implementation tries to fix it
*/
@Override
public void close() throws XMLStreamException {
try {
super.close();
}
finally {
try {
underlyingInputSource.close();
}
catch (Exception e) {
new XMLStreamException(e);
}
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post