0

有谁知道如何使用FileChannel.read(ByteBuffer[],int,int)java-NIO 的 -method 来读取文件的某个部分?

ByteBuffer[] bb = new ByteBuffer[(int) fChannel.size()];
fChannel.read(bb, offsetAddress, endAddress);

尝试执行 read() 方法时抛出 NullPointer。缓冲区应该足够大,offsetAddress 为 0,endAddress 255,文件大小远不止于此。

4

2 回答 2

0

您正在创建一个数组,但您没有在其中放入任何内容。

也许是这样的:

ByteBuffer[] bb = new ByteBuffer[(int) fChannel.size()];
bb[0] = ByteBuffer.allowcate(1024);
bb[1] = ByteBuffer.allowcate(1024);
...
于 2012-05-08T22:08:02.033 回答
0

您将一个空数组传递给该方法,因此读取会引发 NPE,因为没有要读取的缓冲区。

但似乎你做错了, FileChannel.read(ByteBuffer[],int,int) 方法应该执行“分散读取”,其中来自文件通道的数据被顺序读取到一系列缓冲区,例如将文件头和正文从文件读取到不同的缓冲区:

ByteBuffer header = ByteBuffer.allocate( headerLength );
ButeBuffer body = ByteBuffer.allocate( bodyLength );
FileChannel ch = FileChannel.open( somePath );
ch.read( new ByteBuffer[]{ header, body }, dataOffset, headerLength + bodyLength );

将使用第一个 headerLength 字节填充标头,并使用以下 bodyLength 字节填充正文。

如果您只想将文件中的字节读取到缓冲区中(这似乎是 OP 想要的),您应该使用 FileChannel.read(ByteBuffer,long) 方法,该方法将读取与剩余字节一样多的字节给定的缓冲区:

ByteBuffer bb = ByteBuffer.allocate( bytesToRead );
FileChannel ch = FileChannel.open( somePath );
ch.read( bb, dataOffset );
于 2016-02-17T17:45:37.427 回答