複数使用のためにInputStreamをキャッシュする方法

アズダー:

ファイルのInputStreamがあり、Apache poiコンポーネントを使用して、次のようにファイルから読み取ります。

POIFSFileSystem fileSystem = new POIFSFileSystem(inputStream);

問題は、同じストリームを複数回使用する必要があり、POIFSFileSystemが使用後にストリームを閉じることです。

入力ストリームからデータをキャッシュしてから、別のPOIFSFileSystemにより多くの入力ストリームを提供する最良の方法は何ですか?

編集1:

キャッシュとは、アプリケーションを高速化する方法としてではなく、後で使用するためのストアを意味します。また、入力ストリームを配列または文字列に読み取ってから、使用ごとに入力ストリームを作成する方が良いでしょうか?

編集2:

質問をもう一度開いて申し訳ありませんが、デスクトップおよびWebアプリケーション内で作業する場合の条件は多少異なります。まず、Tomcat Webアプリのorg.apache.commons.fileupload.FileItemから取得するInputStreamはマーキングをサポートしていないため、リセットできません。

第二に、ファイルを処理する際のアクセスを高速化し、IOの問題を少なくするために、ファイルをメモリに保持できるようにしたいと考えています。

dfa:

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);
}

編集2

ファイル全体をbyte [](スラップモード)で読み取り、それをByteArrayInputStreamに渡すことができます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Rails-サーバーで使用するためにデータをキャッシュし、複数のユーザーにサービスを提供する方法

分類Dev

GPUキャッシュの使用を最大化するためにVBO / IBOを最適化する方法

分類Dev

GPUキャッシュの使用を最大化するためにVBO / IBOを最適化する方法

分類Dev

jsonをキャッシュするための最良の方法

分類Dev

CodeIgniterで複数のキャッシュフォルダーを使用する方法

分類Dev

SpringCacheで複数のキャッシュ実装を使用する

分類Dev

Spring Data StoreRedis-複数のキャッシュを使用する

分類Dev

Spark:複数のプログラムで使用するためのRDD / DFのキャッシュ

分類Dev

(同時実行性のため)同じキャッシュ領域の複数の再設定を回避する

分類Dev

関数の結果をscalaにキャッシュする方法

分類Dev

json応答をキャッシュするためにmongodbを使用する

分類Dev

複数のスレッドからキャッシュを更新する方法

分類Dev

SDWebImageを使用して複数のサイズの画像の画像をキャッシュする方法

分類Dev

キャッシュをクリアするための Glide を使用した AsyncTask

分類Dev

Google AppEngineノードにキャッシュするための最良の方法

分類Dev

キャッシュされたjQueryオブジェクトをバックボーンの複数のビューで使用できるようにする

分類Dev

グループ化された複数のキャッシュキーを無効にする

分類Dev

フィルタシステムをキャッシュするために、PHPで複数の配列のアイテムのすべての可能な選択を生成する方法

分類Dev

anglejsの使用中にキャッシュを停止する方法

分類Dev

IISサーバーに大きな画像をキャッシュするための最良の方法

分類Dev

ノードjsにデータをキャッシュするための最良の方法

分類Dev

jQuery add()を使用して変数にキャッシュされた選択に要素を追加する方法

分類Dev

express.js:開発のためにメモリ内キャッシュを停止する方法は?

分類Dev

Spring Cache:複数のキャッシュを削除する

分類Dev

ハッシュの値をキャッシュするためのより高速な方法

分類Dev

IEが(キャッシュから)応答を使用しないようにするために、すべてのWebApi応答のキャッシュを無効にする方法

分類Dev

キャッシュ午前12時をリフレッシュするためにどのように春の@cacheable?

分類Dev

埋め込まれたJSONを複数のドキュメントにフラット化する方法

分類Dev

チャネルを使用するためだけに調整されたPhoenixアプリケーションは、複数のマシンでどのように拡張できますか?HAProxyを使用していますか?すべてのノードにメッセージをブロードキャストする方法は?

Related 関連記事

  1. 1

    Rails-サーバーで使用するためにデータをキャッシュし、複数のユーザーにサービスを提供する方法

  2. 2

    GPUキャッシュの使用を最大化するためにVBO / IBOを最適化する方法

  3. 3

    GPUキャッシュの使用を最大化するためにVBO / IBOを最適化する方法

  4. 4

    jsonをキャッシュするための最良の方法

  5. 5

    CodeIgniterで複数のキャッシュフォルダーを使用する方法

  6. 6

    SpringCacheで複数のキャッシュ実装を使用する

  7. 7

    Spring Data StoreRedis-複数のキャッシュを使用する

  8. 8

    Spark:複数のプログラムで使用するためのRDD / DFのキャッシュ

  9. 9

    (同時実行性のため)同じキャッシュ領域の複数の再設定を回避する

  10. 10

    関数の結果をscalaにキャッシュする方法

  11. 11

    json応答をキャッシュするためにmongodbを使用する

  12. 12

    複数のスレッドからキャッシュを更新する方法

  13. 13

    SDWebImageを使用して複数のサイズの画像の画像をキャッシュする方法

  14. 14

    キャッシュをクリアするための Glide を使用した AsyncTask

  15. 15

    Google AppEngineノードにキャッシュするための最良の方法

  16. 16

    キャッシュされたjQueryオブジェクトをバックボーンの複数のビューで使用できるようにする

  17. 17

    グループ化された複数のキャッシュキーを無効にする

  18. 18

    フィルタシステムをキャッシュするために、PHPで複数の配列のアイテムのすべての可能な選択を生成する方法

  19. 19

    anglejsの使用中にキャッシュを停止する方法

  20. 20

    IISサーバーに大きな画像をキャッシュするための最良の方法

  21. 21

    ノードjsにデータをキャッシュするための最良の方法

  22. 22

    jQuery add()を使用して変数にキャッシュされた選択に要素を追加する方法

  23. 23

    express.js:開発のためにメモリ内キャッシュを停止する方法は?

  24. 24

    Spring Cache:複数のキャッシュを削除する

  25. 25

    ハッシュの値をキャッシュするためのより高速な方法

  26. 26

    IEが(キャッシュから)応答を使用しないようにするために、すべてのWebApi応答のキャッシュを無効にする方法

  27. 27

    キャッシュ午前12時をリフレッシュするためにどのように春の@cacheable?

  28. 28

    埋め込まれたJSONを複数のドキュメントにフラット化する方法

  29. 29

    チャネルを使用するためだけに調整されたPhoenixアプリケーションは、複数のマシンでどのように拡張できますか?HAProxyを使用していますか?すべてのノードにメッセージをブロードキャストする方法は?

ホットタグ

アーカイブ