FileOutputStream和BufferedOutputStream原理

FileOutputStream

每次都向内核调一次syscall和write(byte[]),将二进制流写入内核的page cache。不提供flush(),只有close。

测试循环写入123456789,追踪系统调用,每次都写入:
FileOutputStream和BufferedOutputStream原理_第1张图片

BufferedxxxStream

buffer缓存区是jvm层面的东西,默认开辟了8kb的数组。每次write先写入缓存区,等这8kb写满了才调用一次内核syscall和write(byte[]),将二进制流写入内核的page cache。提供flush,手动将数据刷入内核。

测试循环写入123456789,追踪系统调用,达到8k才写入:
在这里插入图片描述

buffer优势:

  1. 减少了应用程序和内核的IO次数,即减少系统调用;
  2. 减少了用户态和内核态切换的次数。

扩展:两者都写入了内核的page cache,由系统机制把脏页刷入硬盘。

另外,看到一篇文章的总结也不错:

FileOutPutStream继承outputStream,并不提供flush()方法的重写所以无论内容多少write都会将二进制流直接传递给底层操作系统的I/O,flush无效果而Buffered系列的输入输出流函数单从Buffered这个单词就可以看出他们是使用缓冲区的,应用程序每次IO都要和设备进行通信,效率很低,因此缓冲区为了提高效率,当写入设备时,先写入缓冲区,等到缓冲区有足够多的数据时,就整体写入设备

使用BufferedXXXStream。默认缓冲区大小是8K。读的时候会一直填满缓冲区(或者文件读取完毕),写的时候也是等缓冲区满了之后(或者执行flush操作)才将内容送入内核缓冲区。效率高的原因就是避免了每读一个字节都要陷入操作系统内核(这是个耗时的操作)。具体代码,题主自己查API吧。

你可能感兴趣的:(操作系统,操作系统,linux)