Java 如果存在';有足够的数据吗?

Java 如果存在';有足够的数据吗?,java,nio,Java,Nio,例如,我有一个文件,其内容是: abcdefg 然后我使用下面的代码读取'defg' ByteBuffer bb = ByteBuffer.allocate(4); int read = channel.read(bb, 3); assert(read == 4); 因为文件中有足够的数据,所以我可以这样认为吗?我是否可以假设,只有当文件中没有足够的字节时,该方法才会返回一个小于给定缓冲区限制的数字 我是否可以假设,只有当文件中没有足够的字节时,该方法才会返回一个小于给定缓冲区限制的数字 J

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

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

ByteBuffer bb = ByteBuffer.allocate(4);
int read = channel.read(bb, 3);
assert(read == 4);
因为文件中有足够的数据,所以我可以这样认为吗?我是否可以假设,只有当文件中没有足够的字节时,该方法才会返回一个小于给定缓冲区限制的数字

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

Javadoc说:

读取可能无法填充缓冲区

并给出了一些例子,以及

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

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

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

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

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

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

Javadoc说:

读取可能无法填充缓冲区

并给出了一些例子,以及

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

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

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

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


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

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

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


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

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

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


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

Javadocs确实指定不保证读取请求的字节数。@Grodriguez。。。这就是我说的。你说“javadoc没有指定会发生什么,只是说如果你在文件的末尾(或同等位置),你只能得到零个字符。”但是javadoc确实指定了更多。它明确指出,您不能假设将读取请求的字节数,唯一的保证是在阻塞模式下,至少会读取一个字节。@Grodriguez-“您不能假设将读取请求的字节数”不是将发生什么的说明。更确切地说,这是一种声明,表明某些东西是未指明的。当我说“没有具体说明会发生什么”时,我非常小心地选择了我的话。@Stephen:你当然是对的。我想我已经看到太多人在这个话题上做出错误的假设,以至于我变得有点兴奋。很抱歉。Javadocs确实指定不能保证读取请求的字节数。@Grodriguez。。。这就是我说的。你说“javadoc没有指定会发生什么,只是说如果你在文件的末尾(或等效的结尾),你只能得到零个字符。”但是javadoc确实指定了mu