Java_IO_BufferedIntputStream_And_BufferedOutputStream

BufferedIntputStream 和 BufferedOutputStream

直接上代码:

BufferedIntputStream 读取文本文件


BufferedOutputStream 写数据



好了,读也有了,写也有了,这不就完美了么。对吧。

其实你仔细的看一看。这,不还是一个一个的去读取么,你之前不是跟我说,有缓冲数组的存在么?我怎么没看出来方便了呢?或者效率高了呢?

别急,先看看源码:


看68行,是不是有一个buf的字节数组,然后你再看看53行,8192,就是这个数组的默认的大小。

再往下看:


看182行,我们不就是用的是这个构造方法的么?对吧,直接传入一个InputStream,这个构造方法直接调用了198行的这个构造方法,先看一下它调用的时候用的是不是那个默认的大小,对吧。最后是203行,是不是生成了一个默认大小为8192的字节数组。至于这个数组怎么用,就自己去看看先把,先讲到这里。


可以了,源码也看完了,demo也写完了。好像也就多了一个缓冲,有啥区别呢?

往下看,

现在你改一下demo中的writeFileUseBufferedOutputStream方法中的文件名,文件名起一个其他的,然后你再注释掉 bos.close(); 这行代码以及相关的try-catch。

运行一遍,你会发现,咦,我文件里面怎么没数据呢?

对了,就是这个效果,文件里面没数据。

然后再来个升级版,现在文件名再换一个,bos.close(); 保持注释,然后把要写的String 写多一点(要大于8192),

运行一下,你会发现,咦,怎么数据只写入了一些,后面的那些没写进去呢?

注意到没?我让你加多点数据,同时要大于8192个,对吧,这就对了。


现在来解释一下上面这个现象,这其实都是缓冲造成的结果,它有个特点,就是缓冲区未满的时候,是不会写进去的,只有当缓冲区满的时候,才会写进去。

那为什么第一次的时候那么少数据也能写进去呢?我不是让你注释掉bos.close(); 么,这就对了,close的时候,不论你缓冲区的数据满不满,都写进去,因为结束了。

其实缓冲是有用的,缓冲数组是内存中的,而我们访问的数据是在硬盘中,所以,读数据的时候,是一次将8192大小的数据读出来,写进内存,然后再进行给程序去读,反过来,写也是一样的,写的时候也是先保存在缓冲数组中,然后满的时候再自动的写进去,直到close,close 表示结束了,所以也就要把剩余的数据也写进去了。


偷偷的告诉你,BufferedOutputStream有一个方法:flush();  手动刷新,调用这个方法也可以往硬盘里面写入数据!

缓冲数组可以减少对硬盘的访问,同时可以提高读写的效率,这里就不对比了,要对比的话,自己可以写一个小的demo去尝试一下,在运行的前后加一句System.currentTimeMillis();,记录一下起始的当前毫秒数,然后再相减,然后记得多运行几次,去均值,取出来的均值进行对比一下,你就会发现。BufferedInputStream 和 BufferedOutputStream 读写文件的效率比 FileInputStream 和 FileOutputStream 的读写的效率高很多!



最后附上IO篇的目录

java_IO 总览

FileInputStream和FileOutputStream的简单使用

Java_IO_BufferedIntputStream_And_BufferedOutputStream

Java_IO_ObjectInputStream_And_ObjectOutputStream

Java_IO_字节流_Reader_and_Writer

Java_IO_SequenceInputStream文件的合并


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值