ファイルの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に渡すことができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加