CachedOutputStream クラスを使用すると、「com.ctc.wstx.exc.WstxEOFException: プロローグで予期しない EOF」が発生するという同じ問題が発生します。
CachedOutputStream クラスのソースを見ると、しきい値を使用して、ストリームのデータを「メモリ内」から「ファイル」に格納します。
ストリームがしきい値を超えるデータで動作すると仮定すると、ファイルに保存されるため、次のコードは壊れます
IOUtils.copy(inputStream,cachedInputStream);
inputStream.close();
cachedInputStream.close(); //closes the stream, the file on disk gets deleted
InputStream tmpInputStream = cachedInputStream.getInputStream(); //returned tmpInputStream is brand *empty* one
// ... reading tmpInputStream here will produce WstxEOFException
「しきい値」を大きくすると、すべてのストリーム データがメモリに格納され、そのようなシナリオで cachedInputStream.close() を呼び出しても基になるストリーム実装が実際には閉じられないため、後で読み取ることができます。
これが上記のコードの「修正済み」バージョンです(少なくとも、私にとっては例外なく機能しました)
IOUtils.copy(inputStream,cachedInputStream);
inputStream.close();
InputStream tmpInputStream = cachedInputStream.getInputStream();
cachedInputStream.close();
// reading from tmpInputStream here works fine
close() が tmpInputStream で呼び出され、それに対する他の参照がなくなると、一時ファイルが削除されます。CachedOutputStream.maybeDeleteTempFile() のソース コードを参照してください。