java.io和文件系统块大小

java.io和文件系统块大小,java,io,filesystems,java-io,Java,Io,Filesystems,Java Io,根据我的理解,假设文件系统块大小是4KB,这意味着所有IO的大小都是4KB。我有两个问题: 当使用java.ioAPI时,比如FileReader,它不会每次读取一个字符,而是每次读取4KB内存。是这样吗 如果上述情况属实,那么在使用BufferedReader之类的工具时,将缓冲区大小设置为小于4KB是没有意义的,对吗?因为至少每次我们都会在内存中获取4KB 谢谢。回答第一个问题:否。它将磁盘块的大小读取到内核内存中。Java(以及用任何语言编写的程序)都无法访问该内存。当您执行原始读取时,无

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

  • 当使用java.ioAPI时,比如FileReader,它不会每次读取一个字符,而是每次读取4KB内存。是这样吗
  • 如果上述情况属实,那么在使用BufferedReader之类的工具时,将缓冲区大小设置为小于4KB是没有意义的,对吗?因为至少每次我们都会在内存中获取4KB
    谢谢。

    回答第一个问题:否。它将磁盘块的大小读取到内核内存中。Java(以及用任何语言编写的程序)都无法访问该内存。当您执行原始读取时,无法保证系统读取的块仍保留在内存中,或者以一种不需要昂贵的后续访问成本的方式轻松访问该块。以下是一种可能的情况:

    程序:“我需要这个文件中的一个字节。”
    OS:“正在从文件加载4KB块。这是您请求的块的字节。”
    节目:“谢谢。我不再需要那个街区了。”
    OS:“好的。释放(或搁置)4KB块,因为没有人再需要它了。”

    程序:“我的循环需要来自此文件的另一个字节。”
    OS:“正在从文件加载4KB块。这是您请求的块的字节。”
    节目:“谢谢。我不再需要那个街区了。”
    OS:“好的。释放(或搁置)4KB块,因为没有人再需要它了。”

    等等

    当然,我把事情大大简化了。操作系统可能会缓存已读取的块。但是你不知道要多久。也许几毫秒,也许几分钟,也许一点也不

    这不仅仅是Java需要考虑的问题。很长一段时间以来,C一直具有独立的和功能


    另请参见:

    谢谢。所以原始FileReader每次读取文件一个字符,只是从内核内存而不是磁盘读取,对吗?假设我需要从文件中读取前5个字符,FileReader必须询问内核内存5次,而内核内存可能需要多次加载相同的块(在最坏的情况下是5次),因此大小为5字节的缓冲区(假设ASCII)在这种情况下仍然有用?因为现在FileReader只需要询问内核内存一次,对吗?是的,这是正确的。同样的效果也可以通过调用FileReader的继承方法来实现,这些方法将
    char[]
    CharBuffer
    作为参数。不要混淆
    FileReader
    FileInputStream
    。它们听起来相似,但完全不同。
    FileReader
    扩展了
    InputStreamReader
    ,并将
    FileInputStream
    传递给超级构造函数。
    InputStreamReader
    使用解码器将字节转换为字符,默认情况下使用8192字节的缓冲区。因此,连续五次向
    FileReader
    请求单个字符不会导致多个操作系统读取调用。这并不意味着它便宜。有同步、有效性检查,在参考实现中,每次读取都将创建一个新的
    char[2]
    数组。@Holger我在检查源代码后看到了代码行DEFAULT\u BYTE\u BUFFER\u SIZE=8192,谢谢您指出。那么FileInputStream呢,原始FileInputStream是否每次从内核内存中获取一个字节?@gfytd是的,当您直接调用
    FileInputStream
    上的读取方法时,每次调用都将在系统调用中结束。