有谁知道如何使用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,文件大小远远超过这个。
答案 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 );