java.io 和文件系统块大小
java.io and file system block size
假设文件系统块大小为4KB,根据我的理解,这意味着所有IO 的大小都是4KB。我有 2 个问题:
- 使用java.io API时,比如说FileReader,它不是每次读取一个字符,而是每次读取4KB到内存中。对吗?
- 如果以上是真的,那么在使用 BufferedReader 之类的东西时将缓冲区大小设置为小于 4KB 是没有意义的,对吧?因为至少我们每次都会将 4KB 提取到内存中。
谢谢。
回答你的第一个问题:不。它将磁盘块的大小读入内核内存。 Java(以及用任何语言编写的程序)不会无法访问该内存。当您进行原始读取时,无法保证系统读取的块保留在内存中,或者它仍然可以轻松访问且后续访问成本不高。这是一种可能的情况:
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.
当然,我把事情简单化了。 OS 可能会缓存它已读取的块。但你无从知晓会持续多久。也许几毫秒,也许几分钟,也许根本没有。
这不仅仅是 Java 中的考虑因素。 C 有单独的 read(2) and fread(3) 函数已经很长时间了。
另请参阅:
假设文件系统块大小为4KB,根据我的理解,这意味着所有IO 的大小都是4KB。我有 2 个问题:
- 使用java.io API时,比如说FileReader,它不是每次读取一个字符,而是每次读取4KB到内存中。对吗?
- 如果以上是真的,那么在使用 BufferedReader 之类的东西时将缓冲区大小设置为小于 4KB 是没有意义的,对吧?因为至少我们每次都会将 4KB 提取到内存中。
谢谢。
回答你的第一个问题:不。它将磁盘块的大小读入内核内存。 Java(以及用任何语言编写的程序)不会无法访问该内存。当您进行原始读取时,无法保证系统读取的块保留在内存中,或者它仍然可以轻松访问且后续访问成本不高。这是一种可能的情况:
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.
当然,我把事情简单化了。 OS 可能会缓存它已读取的块。但你无从知晓会持续多久。也许几毫秒,也许几分钟,也许根本没有。
这不仅仅是 Java 中的考虑因素。 C 有单独的 read(2) and fread(3) 函数已经很长时间了。
另请参阅: