java将提供文件通道。如果有足够的数据,读取的字节数是否少于指定的字节数?
例如,我有一个文件,其内容是:
abcdefg
然后我使用下面的代码来读取'defg'
ByteBuffer bb = ByteBuffer.allocate(4);
int read = channel.read(bb, 3);
assert(read == 4);
因为文件中有足够的数据,所以我可以这么认为吗?我是否可以假设,只有当文件中没有足够的字节时,该方法才会返回一个小于给定缓冲区限制的数字
# 1 楼答案
不,通常您不能假设读取的字节数等于请求的字节数,即使文件中还有待读取的字节
如果您正在从本地文件读取数据,那么请求的字节数很可能会被实际读取,但这并不能保证(如果您正在通过网络读取文件,则不太可能)
参见^{} 方法的文档(它也适用于
FileChannel.read(ByteBuffer)
)。假设通道处于阻塞模式,唯一的保证是至少读取一个字节# 2 楼答案
Javadoc说:
并给出了一些例子
这不足以让你做出这样的假设
在实践中,在读取文件时,您可能总是会得到一个完整的缓冲区,这与文件结束场景是一致的。考虑到进行系统调用的开销,从操作系统实现的角度来看,这是有意义的
但是,我也可以想象返回半空缓冲区可能有意义的情况。例如,当通过慢速网络链接从本地装载的远程文件系统读取数据时,返回部分填充的缓冲区,这样应用程序就可以开始处理数据,这是一种优势。在这种情况下,一些未来的操作系统可能会实现
read
系统调用来实现这一点。如果假设你总是能得到一个完整的缓冲区,那么当你的应用程序在(假设的)新平台上运行时,你可能会大吃一惊另一个问题是,存在某些类型的流,在这些流中,肯定会得到部分填充的缓冲区。套接字流、管道和控制台流就是明显的例子。如果你在编写应用程序时假设文件流的行为,那么当有人在另一种流上运行它时,你可能会大吃一惊。。。失败了