我变得非常奇怪"文件过早结束。"我们的一台服务器上的最近几天例外。 相同的配置XML在另一台服务器上正常工作。我们在这两台服务器上都使用Tomcat 5.0.28。此代码已经工作了很长时间(7年以上),只有在最近服务器崩溃后,我们才在其中一台服务器上遇到此问题。 XML和Java解析代码没有变化。 :(
我能看到的唯一区别是Java版本 -
问题服务器 java版" 1.6.0_16" Java(TM)SE运行时环境(版本1.6.0_16-b01) Java HotSpot(TM)64位服务器VM(版本14.2-b01,混合模式)
工作服务器 java版本" 1.6.0_07" Java(TM)SE运行时环境(版本1.6.0_07-b06) Java HotSpot(TM)64位服务器VM(版本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, - Manish
答案 0 :(得分:59)
Java InputStream存在问题。一旦文件偏移位置计数器移动到文件末尾,就会读取流。在随后使用相同的流读取时,您将收到此错误。因此,您必须再次关闭并重新打开流,或者调用inputStream.reset()
将偏移计数器重置为其初始位置。
答案 1 :(得分:20)
这已经解决了。问题出在其他地方。 cron作业中的另一个代码是将XML截断为0长度文件。我照顾好了。
答案 2 :(得分:14)
只有在解析空字符串/空字节数组时才会发生此异常。
下面的是关于如何重现它的片段:
String xml = ""; // <-- deliberately an empty string.
ByteArrayInputStream xmlStream = new java.io.ByteArrayInputStream(xml.getBytes());
Unmarshaller u = JAXBContext.newInstance(...)
u.setSchema(...);
u.unmarshal( xmlStream ); // <-- here it will fail
答案 3 :(得分:4)
在解析之前,请确保您没有在任何地方消费inputstream
。示例代码如下:
下面的设置是httpresponse
(即响应),主要内容包含在StringEntity (i.e. getEntity())in form of inputStream(i.e. getContent())
内。
InputStream rescontent = response.getEntity().getContent();
tsResponse=(TsResponse) transformer.convertFromXMLToObject(rescontent );
答案 4 :(得分:2)
您确定XML文件的字符编码正确吗? FileReader
始终使用平台默认编码,因此如果“工作”服务器的默认编码为(例如)ISO-8859-1,而“问题”服务器使用UTF-8,则在XML时会看到此错误包含任何非ASCII字符。
如果从FileInputStream而不是FileReader创建InputSource,它是否有效?
答案 5 :(得分:2)
如果未正确关闭输入流,则可能发生此异常。 确保 : 如果使用的输入流未以某种方式使用“之前”,那么您打算阅读。 即如果在单个操作中从相同的输入流读取第二次,则第二次调用将获得此异常。 还要确保在finally块或类似的东西中关闭输入流。
答案 6 :(得分:1)
在我们的例子中,它是一个空 AndroidManifest.xml 。
升级Eclispe时,我们遇到了usual trouble,AndroidManifest.xml必须在被破坏后由构建脚本检入SVN。
通过从Eclipse内部编译而不是从命令行编译来找到它。