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

编辑:从文件中的随机位置读取。

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 回答