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的区别