2012-06-20 29 views
29

提前結束文件我越來越奇怪「文件過早結束」。在我們的一臺服務器上的最後幾天例外。 相同配置XML在另一臺服務器上正常工作。我們在這兩臺服務器上都使用Tomcat 5.0.28。這個代碼一直在工作多年(7歲以上),只有在最近的服務器崩潰之後,我們才面對一個服務器上的這個問題。 XML和Java解析代碼都沒有改變。 :(org.xml.sax.SAXParseException:* VALID * XML

我能看到的唯一區別是Java版本 -

問題的服務器 Java版本 「1.6.0_16」 的Java(TM)SE運行時環境(建立1.6.0_16-B01) Java的熱點(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, - 馬尼什

+0

1.如何是'InputSource'建? 2.「XML」有多大? 3. XML是否來自本地文件,來自URL,數據庫,其他流媒體源 - 可能套接字斷開連接,或者InputStream在解析過程中被關閉? – npe

+0

你確定當服務器崩潰時它沒有添加一些特殊字符?你可以嘗試從你的一臺工作服務器中讀入XML,看看它是否有效。 – npinti

+0

@npe - (1)'InputSource'是建立與'FileReader' - 'this.readSource(新的InputSource(FR));' (2)XML是108.1 2KB大小。現在已經有這麼長時間了。 (3)XML來自本地文件系統。 我也懷疑'InputStream'是否在兩者之間關閉。我如何檢測?再次,想知道爲什麼它的工作之前,而不是現在:( @npinti - 我用SVN的新鮮的XML,並嘗試在XML驗證相同的版本,它*是*有效的XML – Manish

回答

12

已解決。問題在別處。 cron作業中的另一個代碼是將XML截斷爲0長度文件。我已經處理好了。

2

您確保XML文件是正確的字符編碼?因爲如果「工作」服務器的默認編碼爲(例如)ISO-8859-1,並且「問題」服務器使用UTF-8,那麼如果XML包含任何非標準編碼,則會看到此錯誤。 ASCII字符。

如果您從FileInputStream而不是FileReader創建InputSource,它會工作嗎?

49

這是Java InputStream的問題。當文件偏移位置計數器移動到文件末尾時讀取數據流。在隨後通過使用相同的流讀取,你會得到這個錯誤。因此,您必須再次關閉並重新打開數據流,或致電inputStream.reset()將偏移計數器重置爲其初始位置。

+0

試過了,它不起作用! – moldovean

0

在我們的案例中,這是一個空的AndroidManifest.xml

升級Eclispe時,我們遇到了usual trouble,AndroidManifest.xml必須在構建腳本後由構建腳本檢入到SVN中。

通過從Eclipse內部而不是從命令行編譯來發現它。

1

如果輸入流未正確關閉,則可能會發生此異常。 請確保: 如果使用的inputstream沒有以某種方式使用「之前」,那麼您打算閱讀的地方。 即,如果在單次操作中從相同輸入流中第二次讀取,則第二次調用將得到此異常。 還要確保關閉輸入流在finally塊或類似的東西。

2

請確保您在解析之前不在任何地方使用您的inputstream。示例代碼如下: 以下是httpresponse(即響應),主要內容包含在StringEntity (i.e. getEntity())in form of inputStream(i.e. getContent())之內。

InputStream rescontent = response.getEntity().getContent(); 
tsResponse=(TsResponse) transformer.convertFromXMLToObject(rescontent); 
7

只有在解析空的String /空字節數組時纔會發生此異常。

下面

是如何重現它的代碼段:

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 
相關問題