如何缓存InputStream以便多次使用

我有一个文件的InputStream,我使用apache poi组件像这样从中读取:

POIFSFileSystem fileSystem = new POIFSFileSystem(inputStream);

问题是我需要多次使用同一流,并且POIFSFileSystem在使用后会关闭流。

缓存来自输入流的数据,然后将更多输入流提供给不同的POIFSFileSystem的最佳方法是什么?

编辑1:

高速缓存是指存储供以后使用,而不是用来加速应用程序。将输入流读入数组或字符串,然后为每次使用创建输入流是否更好?

编辑2:

抱歉,我再次提出问题,但是在桌面和Web应用程序中工作时,条件有些不同。首先,我从tomcat

Web应用程序中的org.apache.commons.fileupload.FileItem获得的InputStream不支持标记,因此无法重置。

其次,我希望能够将文件保留在内存中,以便在处理文件时更快地访问文件并减少io问题。

回答:

您可以使用以下版本来 修饰 传递给 POIFSFileSystem的 InputStream

,该版本在调用close()时会使用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);

}

回答:

您可以读取整个文件并以byte [](读取模式)将其传递给ByteArrayInputStream

以上是 如何缓存InputStream以便多次使用 的全部内容, 来源链接: utcz.com/qa/427090.html

回到顶部