java.io 和文件系统 block 大小

标签 java io filesystems java-io

假设文件系统 block 大小为4KB,根据我的理解,这意味着所有IO的大小都将是4KB。我有两个问题:

  1. 当使用java.io API时,比如FileReader,它不会每次读取一个字符,而是每次读取4KB到内存中。是这样吗?
  2. 如果上述情况成立,那么在使用 BufferedReader 之类的东西时,将缓冲区大小设置为小于 4KB 是没有意义的,对吗?因为我们每次至少会读取 4KB 到内存中。

谢谢。

最佳答案

回答你的第一个问题:不。它将磁盘 block 的大小读取到内核内存中。Java(以及用任何语言编写的程序)无法访问该内存。当您进行原始读取时,无法保证系统读取的 block 保留在内存中,或者它仍然可以轻松访问,并且后续访问的成本不会很高。这是一种可能的情况:

Program: “I need a byte from this file.”
OS: “Loading 4KB block from file. Here is the byte from that block which you requested.”
Program: “Thank you. I have no more need of that block.”
OS: “Okay. Freeing (or setting aside) the 4KB block since no one needs it anymore.”

Program: “My loop needs another byte from this file.”
OS: “Loading 4KB block from file. Here is the byte from that block which you requested.”
Program: “Thank you. I have no more need of that block.”
OS: “Okay. Freeing (or setting aside) the 4KB block since no one needs it anymore.”

etc.

当然,我把事情过于简单化了。操作系统可能会缓存它已读取的 block 。但你无法知道会持续多久。也许是几毫秒,也许是很多分钟,也许根本就不是。

这不仅仅是 Java 中的一个考虑因素。 C 已单独 read(2)fread(3)长时间发挥作用。

另请参阅:When and why to use buffered input and output streams?

关于java.io 和文件系统 block 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62016554/

相关文章:

java - 如何在 Frege 中声明带有类型变量的 native 接口(interface)?

java - 如何使用在编译时设置的动态数量的参数创建 java 方法(类似 lombok 的行为)

Java 8 流将 List 项减少并组合到 Map

php - Apache 无法在网络共享中修改/创建文件

mysql - 类似 IDE 的系统 - 用于存储的数据库或文件系统

java - 如何使用 Couchbase Java SDK 3 使用不同的端口

Bash 模式匹配循环 super 慢

java - 如何从 vcard 中获取电话号码

encoding - 从 io.Reader 读取 UTF-8 编码的字符串

windows - 如何检查目录符号链接(symbolic link)的目标是否存在?