首页 文章

如果有足够的数据,FileChannel.read会读取比指定的更少的字节吗?

提问于
浏览
1

例如,我有一个文件的内容是:

abcdefg

然后我使用以下代码来读取'defg' .

ByteBuffer bb = ByteBuffer.allocate(4);
int read = channel.read(bb, 3);
assert(read == 4);

因为文件中有足够的数据所以我可以这样想吗?我是否可以假设只有当文件中没有足够的字节时,该方法才会返回小于给定缓冲区限制的数字?

2 回答

  • 3

    我是否可以假设只有当文件中没有足够的字节时,该方法才会返回小于给定缓冲区限制的数字?

    Javadoc说:

    读取可能不会填充缓冲区

    并给出一些例子,和

    如果通道已到达流末尾,则返回读取的字节数,可能为零或-1 .

    这不足以让您做出这样的假设 .

    实际上,在从文件读取时,您可能总是获得完整的缓冲区,以文件结束方案为模 . 考虑到进行系统调用的开销,从OS实现的角度来看,这是有意义的 .

    但是,我也可以想象返回半空缓冲区可能有意义的情况 . 例如,当通过慢速网络链接从本地安装的远程文件系统读取时,返回部分填充的缓冲区以使应用程序可以开始处理数据有一些优点 . 某些未来的操作系统可能会在此方案中实现 read 系统调用 . 如果假设您将始终获得完整缓冲区,那么当您的应用程序在(假设的)新平台上运行时,您可能会感到惊讶 .

    另一个问题是,有一些类型的流,你肯定会得到部分填充的缓冲区 . 套接字流,管道和控制台流是明显的例子 . 如果你在假设文件流行为的情况下对应用程序进行编码,当有人在另一种流上运行它时,你会得到一个令人讨厌的惊喜......并且失败了 .

  • 1

    不,通常 you cannot assume that the number of bytes read will be equal to the number of bytes requested ,即使文件中还有剩余的字节要读取 .

    如果您正在读取本地文件,则可能实际读取所请求的字节数,但这绝不是保证(如果您通过网络读取文件,则可能不会出现这种情况) .

    请参阅ReadableByteChannel.read(ByteBuffer)方法的文档(也适用于 FileChannel.read(ByteBuffer) ) . 假设通道处于阻塞模式,唯一的保证是至少读取一个字节 .

相关问题