我偶尔会从解析大量XML文件的过程中得到标题中的错误。
文件本身看起来没问题,并且在生成错误的相同文件上再次运行该过程就可以了。
调用XMLReader.parse(InputStream is)
这可能是解析器中的错误(我使用piccolo)?或者它是关于我如何打开文件流的?
不涉及多线程。
Piccolo在当时似乎是一个好主意,但我并没有真正有理由使用它。我将尝试切换到默认的SAX解析器,看看是否有帮助。
更新:它没有帮助,我发现Piccolo的某些工作负载要快得多,所以我回去了。
答案 0 :(得分:3)
我应该告诉这个故事的结尾:这是一个愚蠢的错误。有两个进程:一个生成XML文件,另一个生成XML文件。读者只需扫描目录并尝试处理它看到的每个新文件。
每隔一段时间,读者就会在制作人完成写作之前检测到一个文件,因此它合法地引发了“意外的文件结束”的异常。由于我们在这里谈论小文件,这个事件非常罕见。当我来检查时,制作人已经完成了文件的编写,所以对我而言,解析器似乎没有抱怨。
我写道“没有涉及多线程”。显然这是非常误导的。
一种解决方案是将文件写入别处,并在完成后将其移动到受监视的文件夹。更好的解决方案是使用正确的消息队列。
答案 1 :(得分:2)
我在XMLBeans下遇到与Picolo类似的东西。快速谷歌之后,我发现了以下帖子:
XMLBEANS-226 - Exception "Unexpected end of file after null"
该帖子指出,使用Apache Commons(v1.4以后)类org.apache.commons.io.input.AutoCloseInputStream可以解决此异常(我自己没有尝试过,道歉)。
答案 2 :(得分:0)
这是一个多线程场景吗?即你在同一时间解析多个。
您是否在JRE中使用默认的XML解析器?