A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lishuliang28 中级黑马   /  2014-11-30 21:03  /  1601 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么字符流需要对缓冲区进行刷新,才能让数据到达目的地?字节流不需要呢???

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

13 个回复

正序浏览
缓冲区的问题吧
回复 使用道具 举报
因为,字符流,底层也是用字节流来实现的,将字节暂时存在内存中,然后一次性取出。
回复 使用道具 举报
lz看视频不专心哦,老毕上课都说了,字节流先于字符流存在,而且字节流不用刷新会直接存到文件,而字符流其实还是在调用字节流的功能,需要将缓冲区的数据刷新到文件中。
回复 使用道具 举报
受教了,查了api才发现,outputStream居然没有flush()方法。。
回复 使用道具 举报
应该是这样的吧
不是说,字节流不需要对缓冲区进行刷新,而字符流需要。
确切的说都需要,那么在刷新缓冲区的情况 下,就会有两种情况了。
一种为close,这个关闭了,就不可以再续写。
flush是被调用了,还可以继续再写。

也就是说,当文件足够大,或者比较小的时候。
当使用高效读写的时候都会用到包装流,当然在内部读写的过程中,都会是先一次性读满缓冲区的
然后再通过变量,一个个的写到输出流的缓冲区,最后才一次性写到指定文件里
但是有时候缓冲区没有被读满,那么有可能写出的文件就会比目标文件少,那些数据会依然停留在缓冲区内

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
应该是这样的吧
回复 使用道具 举报
杨佳名 发表于 2014-11-30 22:27
因为:1字符 = 2字节,文件数据底层单位是字节。而现在读取字符,所以不能把它们直接写入文件,而是写入了 ...

字节流不用写入到缓冲区吗,那么BufferedOutputSrteam不是也用到了缓冲区吗  为什么它也不需要刷新呢
回复 使用道具 举报
因为:1字符 = 2字节,文件数据底层单位是字节。而现在读取字符,所以不能把它们直接写入文件,而是写入了缓冲区,再进行刷新。(比如汉字是用两个字节存储,不可能将一半汉字写入文件)
而字节流,不用写到缓冲区,直接就写入了文件
回复 使用道具 举报
字符流底层用也的字节流,因为涉及编码,比如写一个汉字,它有两个字节,你不能读一个字节就写入,而要等到两个字节都读取完后,才写入,所以必须要有flush机制。而字节流,不涉及编码,可以读一个就写一个而不出现问题,所以不用刷新也能写入。
回复 使用道具 举报
字符流需要查码表,所以要进缓冲区,所以就需要刷新了。
回复 使用道具 举报
因为字节流没有缓冲区
回复 使用道具 举报
而且 不是必须要flush()才能写入    当你closed()的时候 文件会自动写入目的地,   用flush()是为了当你输入的内容很多的时候清除内存,提高内存的效率。
回复 使用道具 举报
关注这个 问题。个人的理解:
如果你关闭了字符流就不用的用flush如果你不关闭字符流的话只能刷新后才能写入
字符流用到了缓冲区,字节流是不用缓冲区的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马