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