1

私はJavaで圧縮アルゴリズムを作成しています; 私のアルゴリズムを使用するには、ターゲットファイルの構造に関する多くの情報が必要です。

データを収集した後、ファイルを再度読み取る必要があります。 <-しかし、私はしたくありません。

ファイルを再読み込みするときに、ファイルのデータをかなり特殊な形式に「変換」することで、圧縮のターゲットとして適しています。それから私はそれを圧縮します。

現在の問題は次のとおりです。

  1. ファイルを再読み込みするために新しいFileInputStreamを開きたくありません。
  2. 通常はターゲットファイルの150%のサイズである変換されたファイルをディスクに保存したくありません。

ファイルの先頭に移動するためにFileInputStreamを「リセット」する方法はありますか?ディスクに書き込まずに大量の「変換された」データを効率的に保存するにはどうすればよいですか?

4

3 に答える 3

4

1つ以上のRandomAccessFilesを使用できます。それらを、ヒープを消費しないByteBuffer()(実際には約128バイトを使用)またはダイレクトメモリにメモリマップできますが、ランダムにアクセスできます。

一時データは、直接ByteBuffer(s)またはより多くのメモリマップトファイルに保存できます。元のデータにランダムアクセスできるため、メモリ内に思ったほど多くのデータを複製する必要がない場合があります。

このようにして、わずか数KBのヒープでデータ全体にアクセスできます。

于 2011-11-02T17:36:21.480 に答える
0

RandomAccessFileを使用することも、java.nioByteBufferを使用することもできます。(私は知らない。)

リソースはパイプ/ストリームによって保存される可能性があります。圧縮されたストリームにすぐに書き込みます。

リセット時に質問に答えるには:不可能。基本クラスInputStreamには、マークとマークへのリセットのプロビジョニングがありますが、FileInputStreamは、いくつかのオペレーティングシステムに最適化されており、純粋にシーケンシャルな入力を行います。開閉が最適です。

于 2011-11-02T17:43:44.733 に答える
0

方法はありますが、をラップするreset必要があります。FileInputStreamBufferedInputStream

于 2011-11-02T17:36:30.663 に答える