ByteBuffer和FileChannel只读取指定的字节数

时间:2011-10-06 14:54:46

标签: java file-io nio bytebuffer filechannel

我有一种情况,我继续用ByteBuffer阅读如下。

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

但是当读数到达边界时(当剩余的读取字节小于BUFFER_SIZE时),我只需要读取boundaryLimit - FileChannel's current position

表示边界限制为x且当前位置为y,那么我需要从y读取字节直到x,而不是超出此范围。

我如何实现这一目标?

我不想用新容量创建另一个实例。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

除了使用其他API(如FileInputStream,RandomAccessFile或MappedByteBuffer)之外,没有其他答案。如果你必须使用ByteBuffer,你必须在发生后自己检测过度读取,并相应地进行补偿。