Я сталкиваюсь с той же проблемой получения «com.ctc.wstx.exc.WstxEOFException: неожиданный EOF в прологе» при использовании класса CachedOutputStream.
Глядя на источники класса 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 ()