java builder.parse_java – DocumentBuilder.parse关闭InputStream

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

public class DocumentBuilderTest {

public static void main(String[] args) {

try {

InputStream is = new MyInputStream("project.xml");

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

DocumentBuilder documentBuilder = dbf.newDocumentBuilder();

documentBuilder.parse(is);

} catch (Exception e) {

e.printStackTrace();

}

}

static class MyInputStream extends FileInputStream {

public MyInputStream(String filename) throws FileNotFoundException {

super(filename);

}

@Override

public void close() throws IOException {

// here we log when the stream is close.

System.out.println("file input stream closed.");

Exception e = new Exception();

e.printStackTrace();

super.close();

}

}

}

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

at DocumentBuilderTest$MyInputStream.close(DocumentBuilderTest.java:37)

at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.close(XMLEntityManager.java:3047)

at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.close(UTF8Reader.java:661)

at com.sun.xml.internal.stream.Entity$ScannedEntity.close(Entity.java:441)

at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.endEntity(XMLEntityManager.java:1406)

at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1763)

at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipSpaces(XMLEntityScanner.java:1543)

at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$TrailingMiscDriver.next(XMLDocumentScannerImpl.java:1400)

at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)

at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)

at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)

at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)

at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)

at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235)

at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)

at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124)

at DocumentBuilderTest.main(DocumentBuilderTest.java:22)

因此,在此特定示例中,您无法手动关闭流.但是,确定流不再被使用时,关闭输入流总是一个好主意.在您的情况下,一旦文档被解析,输入流不再需要,所以流可以安全地关闭,我建议你这样做.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值