非常に奇妙な「ファイルの終了が早すぎます」サーバーのいずれかでの過去数日間の例外。 same構成XMLは、別のサーバーで正常に機能します。これら両方のサーバーでTomcat 5.0.28を使用しています。このコードは長年(7年以上)動作しており、最近のサーバークラッシュの後、サーバーの1つでこの問題に直面しました。 XMLおよびJava解析コードに変更はありません。 :(
私が見ることができる唯一の違いは、Javaバージョンにあります-
問題サーバー Javaバージョン "1.6.0_16" Java(TM)SEランタイム環境(ビルド1.6.0_16-b01)Java HotSpot(TM)64-ビットサーバーVM(ビルド14.2-b01、混合モード)
Working Server Java version "1.6.0_07" Java(TM)SE Runtime Environment(build 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、-マニッシュ
これは解決されました。問題は他の場所にありました。 cronジョブの別のコードは、XMLを長さ0のファイルに切り捨てていました。私はその世話をしました。
Java InputStreamの問題です。ファイルオフセット位置カウンターがファイルの最後に移動すると、ストリームが読み取られます。同じストリームを使用した後続の読み取りでは、このエラーが発生します。そのため、ストリームを閉じて再度開くか、inputStream.reset()
を呼び出してオフセットカウンターを初期位置にリセットする必要があります。
この例外は、空の文字列/空のバイト配列を解析している場合にのみ発生します。
以下は、それを再現する方法のスニペットです。
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
解析する前にinputstream
を消費していないことを確認してください。サンプルコードは次のとおりです。以下のポーズはhttpresponse
(つまり応答)であり、メインコンテンツはStringEntity (i.e. getEntity())in form of inputStream(i.e. getContent())
内に含まれています。
InputStream rescontent = response.getEntity().getContent();
tsResponse=(TsResponse) transformer.convertFromXMLToObject(rescontent );
入力ストリームが適切に閉じられていないと、この例外が発生する場合があります。確認:使用する入力ストリームが何らかの方法で「前」に使用されていない場合は、読みたい場所。つまり、単一の操作で同じ入力ストリームから2回目に読み取った場合、2回目の呼び出しでこの例外が発生します。また、finallyブロックなどの入力ストリームを必ず閉じてください。
XMLファイルは正しい文字エンコーディングになっていますか? FileReader
は常にプラットフォームのデフォルトエンコーディングを使用するため、「作業」サーバーのデフォルトエンコーディングが(たとえば)ISO-8859-1で、「問題」サーバーがUTF-8を使用している場合、XML ASCII以外の文字が含まれています。
FileReaderではなくFileInputStreamからInputSourceを作成した場合、機能しますか?
この例では、空AndroidManifest.xmlでした。
Eclispeのアップグレード中に 通常の問題 に遭遇し、AndroidManifest.xmlは、上書きされた後、ビルドスクリプトによってSVNにチェックインされている必要があります。
コマンドラインからではなく、Eclipse内からコンパイルすることで見つけました。