是的FileInputStream没有缓冲以及为什么的BufferedInputStream是更快?

Ruizhi :

关于IO,我有两个问题。

A.在教程和一些StackOverflow的答案,他们声称,FileInputStream没有缓冲。真的吗 ?

下面的代码使用FileInputStream于数据读入一个字节数组(1024个字节)

class Test {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("./fos.txt");
        FileOutputStream fos = new FileOutputStream("./copy.txt");

        byte[] buffer = new byte[1024];   // Is this a buffer ? 

        int len;
        while ((len = fis.read(buffer))!= -1) {
            fos.write(buffer);
        }

        fos.close();
        fis.close();
    }
}

从API,有一行:

公共INT读(字节B [])抛出IOException异常

  • @参数B:到其中的数据被读出缓冲器。

B.如果它们都缓冲,他们都将数据放入缓冲区,并获取数据从缓存,这里恰恰是地方,使BufferedInputStream速度比FileInputStream

谢谢

彼得Lawrey:

在教程和一些StackOverflow的答案,他们声称的FileInputStream不会被缓冲。真的吗 ?

写入任何文件是由OS缓冲,然而,在这种情况下,它不是由Java的缓冲。缓冲帮助,当你执行许多小型写入,1 KB写不小。

下面的代码使用的FileInputStream将数据读入一个字节数组(1024个字节)

    int len;
    while ((len = fis.read(buffer))!= -1) {
        fos.write(buffer);
    }

因为它假定你总是准确地读取1024个字节,文件长度始终是1024的倍数这个循环被打破。

相反,你应该写读取的长度。

    for (int len; (len = fis.read(buffer))!= -1; )
        fos.write(buffer, 0, len);

如果他们都被缓冲,他们都将数据放入缓冲区,从缓冲区,其中究竟是使的BufferedInputStream比的FileInputStream快的地方获取数据?

在这种情况下,的BufferedInputStream将默认使用的8 KB缓冲区。这将最多不过减少系统调用的次数为8的一个因素,它会在你的情况要简单得多,只需使用一个8 KB byte[]和节省一些冗余副本。

public static void main(String[] args) throws IOException {
    try (FileInputStream fis = new FileInputStream("./fos.txt");
         FileOutputStream fos = new FileOutputStream("./copy.txt")) {

        byte[] buffer = new byte[8 << 10]; // 8 KB
        for (int len; (len = fis.read(buffer)) != -1; )
            fos.write(buffer, 0, len);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么使用BufferedInputStream逐字节读取文件比使用FileInputStream更快?

为什么没有optirun的glxgears更快

日食 - 为什么的.class没有自动提示?

FileInputStream 真的没有缓冲吗?

是的$(是的)有什么作用?

为什么通过VPN ping的速度比没有VPN更快?

为什么切换比没有更快

为什么没有OpenBLAS的numpy / scipy更快?

为什么没有将缓冲区写入FileChannel

为什么我没有缓冲区溢出?

为什么我的常量缓冲区没有更新?

NLog:为什么 BufferingWrapper 似乎没有缓冲日志条目

为什么Java的FileInputStream read()带有参数,而Oracle的文档说没有呢?

“ BufferedInputStream”与“具有配置大小的FileInputStream”

为什么的instanceof和迭代单列表比一些专门列出了更快?

“ for(;;)”比“ while(TRUE)”更快吗?如果没有,人们为什么要使用它?

为什么在没有换行符的情况下读取文件更快?

在OS X中,为什么使用println()导致我的程序比没有println()的程序运行更快

Gulp任务在没有'return'语句的情况下运行得更快-为什么?

为什么documentFragment没有比重复DOM访问更快?

为什么在没有错误的区域可能更快,但ddrescue却很慢?

什么时候以及为什么要使用没有数据成员的类?

QuickCheck:为什么没有通过测试的函数以及使用什么来代替?

为什么这个缓冲通道没有在我的代码中阻塞?

为什么我的Disruptor程序没有充分利用环形缓冲区

为什么将数据发送到没有缓冲的通道会阻塞执行例程

为什么printf没有在缓冲区溢出中打印出字符串?

RegQueryValueEx返回ERROR_SUCCESS,但没有获取数据缓冲区。为什么?

.NET Core 3 EF中不存在没有联合实体的MN关系,也没有关于为什么的文档