有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将提供文件通道。如果有足够的数据,读取的字节数是否少于指定的字节数?

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

abcdefg

然后我使用下面的代码来读取'defg'

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

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


共 (2) 个答案

  1. # 1 楼答案

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

    如果您正在从本地文件读取数据,那么请求的字节数很可能会被实际读取,但这并不能保证(如果您正在通过网络读取文件,则不太可能)

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

  2. # 2 楼答案

    Can I assume that the method returns a number less than limit of the given buffer only when there aren't enough bytes in the file?

    Javadoc说:

    a read might not fill the buffer

    并给出了一些例子

    returns the number of bytes read, possibly zero, or -1 if the channel has reached end-of-stream.

    这不足以让你做出这样的假设

    在实践中,在读取文件时,您可能总是会得到一个完整的缓冲区,这与文件结束场景是一致的。考虑到进行系统调用的开销,从操作系统实现的角度来看,这是有意义的

    但是,我也可以想象返回半空缓冲区可能有意义的情况。例如,当通过慢速网络链接从本地装载的远程文件系统读取数据时,返回部分填充的缓冲区,这样应用程序就可以开始处理数据,这是一种优势。在这种情况下,一些未来的操作系统可能会实现read系统调用来实现这一点。如果假设你总是能得到一个完整的缓冲区,那么当你的应用程序在(假设的)新平台上运行时,你可能会大吃一惊

    另一个问题是,存在某些类型的流,在这些流中,肯定会得到部分填充的缓冲区。套接字流、管道和控制台流就是明显的例子。如果你在编写应用程序时假设文件流的行为,那么当有人在另一种流上运行它时,你可能会大吃一惊。。。失败了