org.xml.sax.SAXParseException: *VALID* XML 的文件过早结束

2022-08-31 16:34:33

我得到了非常奇怪的“文件过早结束”,最后几天在我们的一台服务器上例外。相同的配置 XML 在另一台服务器上工作正常。我们在这两个服务器上都使用Tomcat 5.0.28。这段代码已经工作了很长时间(7年以上),只是在最近的服务器崩溃之后,我们在其中一台服务器上遇到了这个问题。XML 和 Java 解析代码中没有变化。:(

我能看到的唯一区别是在Java版本中 -

问题服务器 java 版本 “1.6.0_16” Java(TM) SE 运行时环境 (build 1.6.0_16-b01) Java HotSpot(TM) 64 位 Server VM (build 14.2-b01, 混合模式)

工作服务器 java 版本 “1.6.0_07” Java(TM) SE 运行时环境 (build 1.6.0_07-b06) Java HotSpot(TM) 64 位服务器 VM (build 10.0-b23, 混合模式)

以下是已经工作了几年的Java代码 -

private void readSource(final InputSource in ) {
    try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(in);
        Element elt = doc.getDocumentElement();

        this.readElement( elt );
    } catch ( Exception ex ) {
        ex.printStackTrace();
        throw new ConfigurationException( "Unable to parse configuration information", ex );
    }
}

这是个例外。

[Fatal Error] :-1:-1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
        at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
        at com.circus.core.Configuration.readSource(Configuration.java:706)

我已经尝试验证XML,没有发现任何错误。任何想法,我还可以在哪里寻找可能的问题?

任何指针将不胜感激!

TIA, - 马尼什语


答案 1

这是Java InputStream的一个问题。当读取流时,一旦文件偏移位置计数器移动到文件末尾。在随后使用相同的流读取时,您将收到此错误。因此,您必须关闭并再次重新打开流,或者调用以将偏移计数器重置为其初始位置。inputStream.reset()


答案 2

此问题已得到解决。问题出在其他地方。cron 作业中的另一个代码是将 XML 截断为 0 长度的文件。我已经处理好了。


推荐