2

以下のように ByteBuffer を使用して読み続ける状況があります。

 ByteBuffer buffer = MappedByteBuffer.allocateDirect(Constants.BUFFER_SIZE);

しかし、読み取りが境界に達したとき (読み取る残りのバイト数が BUFFER_SIZE 未満のとき) boundaryLimit - FileChannel's current position、.

境界制限が x で、現在の位置が y であることを意味します。次に、バイトを読み取る必要があり、それをy超えxないようにする必要があります。

どうすればこれを達成できますか?

新しい容量で別のインスタンスを作成したくありません。

4

2 に答える 2

2

ここで MappedByteBuffer を使用するのは誤解を招きます。使用する必要があります

ByteBuffer buffer = ByteBuffer.allocateDirect(Constants.BUFFER_SIZE);

読み取ったバイト数が全バイト未満の場合は問題ありません

channel.read(buffer);
buffer.flip();
// Will be between 0 and Constants.BUFFER_SIZE
int sizeInBuffer = buffer.remaining(); 

EDIT:ファイル内のランダムな場所から読み取る。

RandomAccessFile raf = 
MappedByteBuffer buffer= raf.getChannel()
        .map(FileChannel.MapMode.READ_WRITE, start, length);
于 2011-10-06T15:08:39.610 に答える
0

FileInputStream、RandomAccessFile、または MappedByteBuffer などの別の API を使用する以外に、これに対する答えはありません。ByteBuffer を使用する必要がある場合は、オーバーリードが発生した後にそれを自分で検出し、それに応じて補正する必要があります。

于 2011-10-07T01:05:29.323 に答える