首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java-NIO:对offset-address / NullPointer使用FileChannel.read()

Java-NIO:对offset-address / NullPointer使用FileChannel.read()
EN

Stack Overflow用户
提问于 2012-05-09 06:06:05
回答 2查看 1.1K关注 0票数 0

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

代码语言:javascript
复制
ByteBuffer[] bb = new ByteBuffer[(int) fChannel.size()];
fChannel.read(bb, offsetAddress, endAddress);

在尝试执行read()-method时引发NullPointer。缓冲区应该足够大,offsetAddress为0,endAddress为255,文件大小远远超过这个大小。

EN

回答 2

Stack Overflow用户

发布于 2012-05-09 06:08:02

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

可能是这样的:

代码语言:javascript
复制
ByteBuffer[] bb = new ByteBuffer[(int) fChannel.size()];
bb[0] = ByteBuffer.allowcate(1024);
bb[1] = ByteBuffer.allowcate(1024);
...
票数 0
EN

Stack Overflow用户

发布于 2016-02-18 01:45:37

您将一个空数组传递给该方法,因此读取操作将抛出NPE,因为没有缓冲区可供读取。

但是看起来你做错了,FileChannel.read(ByteBuffer[],int,int)方法应该执行一个“分散读”,在这个过程中,来自文件通道的数据被顺序地读到一系列的缓冲区中,例如,将一个文件的头部和主体读到不同的缓冲区:

代码语言:javascript
复制
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字节填充header,用下面的bodyLength字节填充body。

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

代码语言:javascript
复制
ByteBuffer bb = ByteBuffer.allocate( bytesToRead );
FileChannel ch = FileChannel.open( somePath );
ch.read( bb, dataOffset );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10507247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档