4

MappedByteBufferの2GIGへのJavaの制限により、大きなファイルのマッピングに使用するのは困難です。通常推奨されるアプローチは、MappedByteBufferの配列を使用し、次の方法でインデックスを作成することです。

long PAGE_SIZE = Integer.MAX_VALUE;
MappedByteBuffer[] buffers;

private int getPage(long offset) {
    return (int) (offset / PAGE_SIZE)
}

private int getIndex(long offset) {
    return (int) (offset % PAGE_SIZE);
}

public byte get(long offset) {
    return buffers[getPage(offset)].get(getIndex(offset));
}

これは1バイトで機能する可能性がありますが、より大きく、境界を越える必要がある読み取り/書き込み(getLong()またはget(byte []))を処理する場合は、多くのコードを書き直す必要があります。

質問:この種のシナリオのベストプラクティスは何ですか?車輪の再発明をせずに再利用できる実用的なソリューション/コードを知っていますか?

4

1 に答える 1

6

dsiutilByteBufferInputStreamをチェックアウトしましたか?

Javadoc

このクラスの主な有用性は、実際にに基づく入力ストリームの作成を可能にすることMappedByteBufferです。

特に、ファクトリメソッドmap(FileChannel, FileChannel.MapMode)は、ファイル全体をの配列にメモリマップし、ByteBufferその配列をByteBufferInputStreamとして公開します。これにより、2GiBより大きいマップされたファイルに簡単にアクセスできます。

  • long length()
  • long position()
  • void position(long newPosition)

それはあなたが考えていたものですか? LGPLでもあります。

于 2011-04-29T13:03:11.293 に答える