FileWriter和FileReader的底层原理:缓存区技术

  • FileReader的底层原理
  • FileWriter的底层原理
  • 注意事项

FileReader的底层原理

字节输入流FileReader用于读出文件中的数据到内存中,而且每次只能读取一个字节。这其中内存和文件和被大量的访问,这无疑会很耗费时间,为了解决这个问题,java在设计FileReader时候运用了缓存区计算,用于优化这个问题

底层优化概述

**为了避免内存和文件之间频繁的访问,java在内存中创建了一个缓存区(内存中的一块区域,长度为8192的字节数组)。在读取数据之前,和先判断缓存区中是否有数据,如果没有,会先把数据读到缓存区中,并且尽可能把缓存区读满。然后再从缓存区

中往内存中读取当缓存区中是数据都被读取完才会从新装填缓存区**

  • 如果我们的文件比较大,超出了8192个字节,那缓存区将怎样读取?

,当缓存区中的8192个字节的数据都被读取完,它才会将文件中剩下的数据放在缓冲区中,然后读取缓冲区

综合举例


当我们调用read方法就读取了8192个字节的数据到内存中(认为源文件中的数据大于8192字节),当时当我们创建了FileOutputStream的对象,我们就把源文件的数据清空了,所有我们最后也只能读取在缓存区中8192个字节的数据了

FileWriter的底层原理

FileWriter流用于写入数据到文件中,同样存在文件和内存的交互,java同样使用了缓存区进行优化

  • 原理概述

也是同样在内存中创建了长度为8192个字节的缓存区,在调用write方法的时候,会先将数据读到缓存区中,当读满时,会一次性写到文件汇总

当- 1.缓冲区装满了

  • 2.手动刷新缓冲区(flush方法)
  • 3.释放资源(close)
    进行以下三种操作可以将缓冲区中的数据保存到本地文件中
    第一种情况:

我们循环8192次,运行完后缓存区刚刚好有8192个数据,并没有满,所有没有将数据写入到文件中

当我们循环8193次,缓存区里面的数据就满了,然后把数据写到了文件中,文件中的大小刚好是8192个字节,表明还有一个数据在缓存区中

第二种情况(close)


当我们在后面关闭了资源,在文件中就存在数据,否则数据还在缓存区中,没有写入到文件中

第三种情况


flush和close差不多

colse和flush的区别

posted @ 2023-02-21 17:49  一往而深,  阅读(407)  评论(0编辑  收藏  举报