最近,我创建了强制用户界面实现单fromStream(OutputStream)
使用它的默认方法看起来像这样:什么让文件读取没有缓冲区如此昂贵?
public default T fromFile(File file) throws IOException {
try (InputStream stream = new FileInputStream(file)) {
return fromStream(stream);
}
}
后不久事实证明,这是非常昂贵(每MB几秒钟)由于单字节被直接从FileInputStream
读取。
将其包装在BufferedInputStream
解决了我的问题,但它给我留下了为什么FileInputStream
是如此非常昂贵的问题。
文件频道未关闭或读取字节时打开,所以为什么有需要摆在首位的缓冲区?
那么,一个非常差的操作系统可以这样做,但每个具有Java实现的操作系统都具有内部OS文件系统缓存,用于缓冲磁盘中的数据块,因此该块将不会再被读取。但即使从文件系统缓存中读取,也需要系统调用,与处于用户进程内部的任何内容相比,这会带来很大的开销。见Stephen的回答。 –