Administrator
发布于 2024-08-18 / 0 阅读
0
0

BufferedInputStream & BufferedOutputStream

BufferedInputStream & BufferedOutputStream
refer to : https://blog.csdn.net/qq_27184497/article/details/120948214

FilteOutputStream

不带缓冲的操作(FilteOutputStream类和FilteInputStream类),每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以在读写的字节比较少的情况下,效率比较低;

FileOutputStream fileOutputStream = new FileOutputStream("D:\\1.txt");

BufferedOutputStream

BufferedOutputStream是带缓冲区的输出流,不管是BufferedOutputStream还是BufferedInputStream里面都自带了默认缓冲区,大小是8192Byte,也就是8KB ,能够减少访问磁盘的次数,提高文件读取性能;它们都用到了装饰器模式;将FilteOutputStream装到里面,所以 BufferedOutputStream 是 依赖FilteOutputStream 的;

当传输的文件特别大的时候,BufferedOutputStream的优点就体现出来了 ,带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小(默认8KB)的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!这就是两者的区别


BufferedOutputStream什么时候会往磁盘中写数据呢?

第①种:缓存区满了,写出去!
第②种:flush()方法被调用,写出去!
第③种:close()方法被调用,写出去!因为,close()方法被调用的时候,会先调用flush()方法。


如何设置缓冲区大小
看到了吗?构造方法的第二个参数就是缓冲区大小,可以自己自行配置,默认的size就是8192,也就是8kb。

// out 写
BufferedOutputStream in = new BufferedOutputStream(new FileOutputStream("D:\\out.txt"),8192);

// in  读
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("D:\\in.txt"),8192);

区别
通过介绍,对它们内部的也就有了一定的了解了;

image-20240818071321065

BufferedOutputStream 真的比 FileOutputStream 快吗?

为了验证这个这个问题,我们需要做两轮测试,通过写入少量的数据和大量数据对比一下它们之间的速度如何;

结论
通过以上的数据可以得出结论,谁快谁慢是根据实际情况来决定的,而不是说带了缓冲区就一定快;

每次写入的数据量小的情况下,带缓冲区的BufferedOutputStream效率更快;

每次写入的数据量比较大时,不带缓冲区的 FileOutputStream 效率更快;

所以,大家在选择的时候就需要根据实际情况来决定使用哪种IO流了,而大部分情况下,FileOutputStream 就已经足够了,只需要将写入的数据量大一点即可;


评论