0
public static String getTextOf(String xsl) throws Exception {
      DocXHandler docxh1 = new DocXHandler(ACE.getInputFilePath());
      InputStream inputDocumentXMLStream = docxh1.getInputDocumentXMLZERO();
    return new Cache().getXSLOutput(inputDocumentXMLStream, xsl);
}

上記のメソッドは、異なるxsl引数を使用して100回以上呼び出されます。これで、InputStream inputDocumentXMLStreamに値が割り当てられるたびに(ええ、100回以上)。このコードをリファクタリングしようとしているので、InputStreamに値が割り当てられるのは1回だけです。私のコードは今このようになりました。

  public static String getTextOf(String xsl) throws Exception {
     return new Cache().getXSLOutput(inputDocumentXMLStream, xsl);
   }

inputDocumentXMLStreamをグローバルプロパティとして変更します。初めて正しい結果が得られましたが、2回目は以下のエラーが発生しました。

Unexpected end of ZLIB input stream

もう一度読む方法を教えてください。

4

5 に答える 5

2

エラーメッセージに示されているように、ストリームを読み取ることができるのは1回だけです。その後、EOFになります。あなたがやろうとしていることは意味がありません。

于 2012-11-15T06:50:47.853 に答える
1

蒸気は一方向にのみ移動するため、蒸気の終わりに達した後は、入力ストリームの読み取りを再開することはできません。

問題を解決するための最良のアイデアは、XMLファイルを一度完全に解析し、いくつかのJavaオブジェクトに値を配置することだと思います。完了したら、マップを使用して必要な値を取得できます。これも非常に効率的です。

例えば

    Object parseValueMap = paseXML(inputDocumentXMLStream);//use appropriate object
    //^ called only once, you may use some libraries such as JAXB to parse the xml

xslパス式であると仮定すると、上記の手順で作成したJavaコレクションにパスを適用することをお勧めします。次のようなライブラリを使用できますJXPath

     String value = JXPathEvaluator(parseValueMap, xsl);

お役に立てれば。

于 2012-11-15T07:02:32.083 に答える
1

何をしているのかgetXSLOutput、なぜ同じ入力ストリームを100回読み取る必要があるのか​​わかりませんが、EOFを回避するには、mark(int)getXSLOutputを使用してメソッドのストリームの開始をマークし、終了時にresetを呼び出すことができます。同じ方法。しかし、間違ったことのようです...

より良い結果を得るには、それを1回読み取り、その内容をJavaのデータ型に格納してから、その100回の作業を試してください。

于 2012-11-15T07:04:45.437 に答える
0

ファイルを閉じずに、ファイル全体で入力ストリームを再利用することはできません。すべてのファイルI/O機能は、EOFに依存して停止します。

于 2012-11-15T06:53:10.283 に答える
0

xlsファイルごとに、ファイルを解析してJavaのExcelドキュメントインスタンスを作成する必要があります。そのJavaインスタンスはあなたにInputStreamを与えるでしょう。したがって、この場合、逃げ道はありません。

ただし、同じファイルに対して同じInputStreamを使用できます。そして、それは単一のユニットまたは作業になります。

于 2012-11-15T06:58:46.917 に答える