当前位置: 首页 > 面试题库 >

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

孙斌
2023-03-14
问题内容

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

abcdefg

然后我使用以下代码读取“ defg”。

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

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


问题答案:

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

Javadoc说:

读取可能无法填充缓冲区

并举例说明

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

这还不足以让您做出该假设。

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

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

另一个问题是,有 一些种类的流在那里你会的 肯定
得到部分填充的缓冲区。套接字流,管道和控制台流是明显的示例。如果您使用文件流行为对应用程序进行编码,那么当有人针对另一种流运行应用程序而失败时,您可能会感到讨厌。



 类似资料:
  • 据我所知,缓冲阅读器比非缓冲阅读器优化了很多,因为每次读取都将从内存中完成,不需要每次都从磁盘/网络进行I/O读/写。 所以我在这里阅读答案: 缓冲读取器和文件读取器之间的特定区别 我被第二个答案弄糊涂了,这个答案似乎有很高的票数: 当向BufferedReader对象发出“read”指令时,它会使用FileReader对象从文件中读取数据。当给出指令时,FileReader对象一次读取2(或4)

  • 问题 你想读写二进制文件,比如图片,声音文件等等。 解决方案 使用模式为 rb 或 wb 的 open() 函数来读取或写入二进制数据。比如: # Read the entire file as a single byte string with open('somefile.bin', 'rb') as f: data = f.read() # Write binary data to

  • http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read() 文档说“从输入流中读取一些字节,并将它们存储到缓冲区数组b中”。 Java 中的 InputStream read() 如何确定字节数?

  • 问题内容: 我知道 bufio 包中的golang中的特定功能。 Peek返回下一个n个字节, 而不会使阅读器前进 。在下一个读取调用中,字节停止有效。如果Peek返回的字节数少于n个字节,则它还会返回一个错误,解释读取短的原因。如果n大于b的缓冲区大小,则错误为ErrBufferFull。 我需要能够从阅读器读取特定数量的字节,以 使阅读器更先进 。基本上,与上面的功能相同,但是它使阅读器更高级

  • 从urlConnection获得的InputStream向ByteArrayOutputStreet写入数据的处理。getInputStream()花费的时间超过1分钟。 代码片段 一些观察结果是: while循环单独执行超过一分钟,并且迭代了大约2650次 HttpURLConnection响应代码为200,因此整个内容在InputStream中可用 文件的内容长度为7631029(字节)。 我

  • 本文向大家介绍C语言实现 数据类型占多少字节指针占多少字节,包括了C语言实现 数据类型占多少字节指针占多少字节的使用技巧和注意事项,需要的朋友参考一下 具体代码如下所示: 结果: 知识点扩展: c语言实现十进制与ASCII码互转 总结 以上所述是小编给大家介绍的C语言实现 数据类型占多少字节指针占多少字节,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对