DocumentBuilder.parse是否关闭输入流

对于类似于以下内容的代码:

InputStream is=newfileinputstream(“test.xml”);
Document doc=DocumentBuilder.parser(is);

我的问题是是否需要手动关闭流(invoke is.close())。DocumentBuilder是否为我关闭输入流

使用以下测试代码查看输入流是否关闭,您可以看到哪行代码关闭了该流

公共类文档构建测试{
公共静态void main(字符串[]args){
试一试{
InputStream is=newMyInputStream(“project.xml”);
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder DocumentBuilder=dbf.newDocumentBuilder();
documentBuilder.parse(is);
}捕获(例外e){
e、 printStackTrace();
}
}
静态类MyInputStream扩展FileInputStream{
公共MyInputStream(字符串文件名)引发FileNotFoundException{
超级(文件名);
}
@凌驾
public void close()引发IOException{
//在这里,我们记录流关闭时的日志。
System.out.println(“文件输入流关闭”);
异常e=新异常();
e、 printStackTrace();
super.close();
}
}
}

传递给DocumentBuilder的输入流是否关闭取决于DOMParser实现。在我的环境中,文件输入流已关闭,请参见下面的堆栈跟踪:

DocumentBuilderTest$MyInputStream.close(DocumentBuilderTest.java:37)
在com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.close(XMLEntityManager.java:3047)
位于com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.close(UTF8Reader.java:661)
在com.sun.xml.internal.stream.Entity$ScannedEntity.close(Entity.java:441)上
在com.sun.org.apache.xerces.internal.impl.XMLEntityManager.endEntity(XMLEntityManager.java:1406)
在com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load上(XMLEntityScanner.java:1763)
在com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipSpaces(XMLEntityScanner.java:1543)
在com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$TrailingMiscDriver.next上(XMLDocumentScannerImpl.java:1400)
位于com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
位于com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
位于com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
位于com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
位于com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
位于com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235)
位于com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
位于javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124)
在DocumentBuilderTest.main(DocumentBuilderTest.java:22)

因此,在此特定示例中,您无法手动关闭流。然而,当您确定不再使用输入流时,关闭该流始终是一个好主意。在您的例子中,一旦解析了文档,就不再需要输入流,因此可以安全地关闭该流,我建议您这样做

发表评论