Как кэшировать InputStream для многократного использования
вы можете украсить InputStream, передаваемый .java в POIFSFileSystem, с помощью версии, которая jdk при вызове close() отвечает inputstream с помощью reset():
class ResetOnCloseInputStream extends InputStream {
private final InputStream decorated;
public ResetOnCloseInputStream(InputStream anInputStream) {
if (!anInputStream.markSupported()) {
throw new IllegalArgumentException("marking not supported");
}
anInputStream.mark( 1 << 24); // magic constant: BEWARE
decorated = anInputStream;
}
@Override
public void close() throws IOException {
decorated.reset();
}
@Override
public int read() throws IOException {
return decorated.read();
}
}
тестовый пример
static void closeAfterInputStreamIsConsumed(InputStream is)
throws IOException {
int r;
while ((r = is.read()) != -1) {
System.out.println(r);
}
is.close();
System.out.println("=========");
}
public static void main(String[] args) throws IOException {
InputStream is = new ByteArrayInputStream("sample".getBytes());
ResetOnCloseInputStream decoratedIs = new ResetOnCloseInputStream(is);
closeAfterInputStreamIsConsumed(decoratedIs);
closeAfterInputStreamIsConsumed(decoratedIs);
closeAfterInputStreamIsConsumed(is);
}
ИЗМЕНИТЬ 2
вы можете cache-coherence прочитать весь файл в байтах poi [] (режим slurp), а затем apache-poi передать его в ByteArrayInputStream
java
caching
inputstream
apache-poi
2021-12-22T14:00:09+00:00
2022-07-27T17:11:22+00:00
Xqzmelol
Вопросы с похожей тематикой, как у вопроса:
Как кэшировать InputStream для многократного использования
Предупреждение о файлах Cookies
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.