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

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

abcdefg 

然后我使用以下代码来读取’defg’。

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

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

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

Javadoc说:

读取可能不会填充缓冲区

并给出一些例子,和

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

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

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

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

另一个问题是,有一些类型的流,你肯定会得到部分填充的缓冲区。 套接字流,管道和控制台流是明显的例子。 如果您在假设文件流行为的情况下对应用程序进行编码,那么当某人针对另一种流运行它时,您可能会感到非常惊讶……并且失败了。

不,通常您不能假设读取的字节数将等于请求的字节数 ,即使文件中还有剩余字节要读取。

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

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