2011-10-06 10 views
2

私は以下のようにByteBufferで読み続ける状況があります。ByteBufferとFileChannelは指定されたバイト数だけを読み込みます

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

しかし、読みが境界に到達したとき、私は唯一のboundaryLimit - FileChannel's current position読む必要がある(残りのバイトが読みときBUFFER_SIZE未満)。

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

どうすればよいですか?

新しい容量で別のインスタンスを作成したくないです。

+0

「*が境界に到達するとどういう意味ですか?」 – aioobe

+0

読み取りのみを続行するための制限があります。それ以降のバイトは読み込まないでください。その限界が境界です。更新された質問 – nobody

答えて

2

ここでMappedByteBufferを使用するのは間違いです。ファイル内のランダムな場所から読み込むには:あなたはバイトの全額そのない問題

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

EDIT未満を読めばあなたは

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

を使用する必要があります。

RandomAccessFile raf = 
MappedByteBuffer buffer= raf.getChannel() 
     .map(FileChannel.MapMode.READ_WRITE, start, length); 
+0

その非常に大きなファイルと私は上限を超えてデータを必要としない。実際には、指定された開始位置から指定された終了位置までデータを読み取ることを意図しています。 – nobody

+0

ファイルのランダムな領域を読み書きする方がはるかに簡単な解決法があります。 READ_ONLYまたはREAD_WRITEにすることができます。 –

0

などのFileInputStream、RandomAccessFileの、もしくはれるMappedByteBufferなどの別のAPIを使用するよりも、この他に何も答えはありません。 ByteBufferを使用する必要がある場合は、それが起こった後に自分自身でオーバーリードを検出し、それに応じて補う必要があります。

関連する問題