假设文件系统 block 大小为4KB,根据我的理解,这意味着所有IO的大小都将是4KB。我有两个问题:
- 当使用java.io API时,比如FileReader,它不会每次读取一个字符,而是每次读取4KB到内存中。是这样吗?
- 如果上述情况成立,那么在使用 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.io 和文件系统 block 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62016554/