2012-05-08 50 views
0

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

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

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

+0

因此,您正在为文件的每个字节创建一个ByteBuffer?那是什么意思?你的文件大小是多少? –

回答

0

您正在创建一个数组,但您并未在其中放入任何东西。

也许是这样的:

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

是的,当然,忘了张贴。用一些硬编码的bb填充数组也给了我一个空指针。所以需要将多少个字节缓冲区分配给数组?我根本不知道它的工作方式,因此不知道如何正确使用它。 –

+1

@ user1004816那么为什么要使用它呢?为什么不使用write(ByteBuffer)并保持简单?如果你没有*多个ByteBuffers来编写,创建它们只是为了满足你不需要的API是毫无意义的。 – EJP

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