6

我正在使用 Xerces 库来解析 XML。下面是解析的代码片段:

文档 doc = builder.parse(new InputSource(new StringReader(someXMLString)));

我是否需要手动关闭或该方法会InputStream处理它?InputSourceparse

4

6 回答 6

6

鉴于您没有外部资源 - 只是一个StringReader- 您不需要关闭它。无论如何我都会这样做......那么如果您更改代码以使用不同的输入,您将不会意外地发生资源泄漏。

(对于一次性代码,我会保留它 - 但请注意,如果您不小心,一次性代码的寿命会比预期的要长。)

于 2012-12-25T08:33:51.233 回答
2

DocumentBuilder API 中似乎没有关于它的内容。我们可以将其测试为

InputStream is = new FileInputStream("test.xml") {
    @Override
    public void close() throws IOException {
        System.out.println("close");
        super.close();
    }
};
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
documentBuilder.parse(is);

它打印close。但由于 API 中没有任何内容,因此无法保证这种行为。

于 2012-12-25T08:44:47.533 回答
1

你应该自己关闭它。

builder.parse 方法不会在其实现中关闭流。它不知道什么时候适合关闭流,所以这需要手动关闭流。

于 2012-12-25T08:36:47.070 回答
0

如果您使用 try-with 那么您可以让 java 为您关闭它。否则我会建议手动关闭它。

于 2012-12-25T08:31:50.500 回答
0

InputStream应该关闭,因为close()方法:

关闭此输入流并释放与该流关联的所有系统资源。

您的流是否使用资源并不重要 - 这是关闭它的好方法。只是要确定。

于 2012-12-25T08:32:02.933 回答
0

InputSource只是流上的一个方便的类包装器,因此它不会关闭其中的流。

于 2012-12-25T08:35:55.283 回答