Java-NIO:将FileChannel.read()与offset-address / NullPointer一起使用

时间:2012-05-08 22:06:05

标签: java nio offset filechannel

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

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

尝试执行read()方法时抛出NullPointer。缓冲区应该足够大,offsetAddress是0,endAddress 255,文件大小远远超过这个。

2 个答案:

答案 0 :(得分:0)

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

也许是这样的:

ByteBuffer[] bb = new ByteBuffer[(int) fChannel.size()];
bb[0] = ByteBuffer.allowcate(1024);
bb[1] = ByteBuffer.allowcate(1024);
...

答案 1 :(得分:0)

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

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

d3.extent(nyb.features, function(d) { return d.properties.someno; })

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

如果你只想将文件中的字节读入缓冲区(这似乎是OP想要的那样),你应该使用FileChannel.read(ByteBuffer,long)方法,它将读取尽可能多的字节数。给定缓冲区中的剩余字节:

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