黑马程序员技术交流社区

标题: java基础IO流中 [打印本页]

作者: lishuliang28    时间: 2014-11-30 21:03
标题: java基础IO流中
为什么字符流需要对缓冲区进行刷新,才能让数据到达目的地?字节流不需要呢???
作者: 与梦逆风而行    时间: 2014-11-30 21:50
关注这个 问题。个人的理解:
如果你关闭了字符流就不用的用flush如果你不关闭字符流的话只能刷新后才能写入
字符流用到了缓冲区,字节流是不用缓冲区的
作者: 与梦逆风而行    时间: 2014-11-30 21:54
而且 不是必须要flush()才能写入    当你closed()的时候 文件会自动写入目的地,   用flush()是为了当你输入的内容很多的时候清除内存,提高内存的效率。
作者: 戴高乐    时间: 2014-11-30 22:08
因为字节流没有缓冲区
作者: Cfan_yang    时间: 2014-11-30 22:11
字符流需要查码表,所以要进缓冲区,所以就需要刷新了。
作者: 戴高乐    时间: 2014-11-30 22:20
字符流底层用也的字节流,因为涉及编码,比如写一个汉字,它有两个字节,你不能读一个字节就写入,而要等到两个字节都读取完后,才写入,所以必须要有flush机制。而字节流,不涉及编码,可以读一个就写一个而不出现问题,所以不用刷新也能写入。
作者: 杨佳名    时间: 2014-11-30 22:27
因为:1字符 = 2字节,文件数据底层单位是字节。而现在读取字符,所以不能把它们直接写入文件,而是写入了缓冲区,再进行刷新。(比如汉字是用两个字节存储,不可能将一半汉字写入文件)
而字节流,不用写到缓冲区,直接就写入了文件
作者: lishuliang28    时间: 2014-12-1 08:28
杨佳名 发表于 2014-11-30 22:27
因为:1字符 = 2字节,文件数据底层单位是字节。而现在读取字符,所以不能把它们直接写入文件,而是写入了 ...

字节流不用写入到缓冲区吗,那么BufferedOutputSrteam不是也用到了缓冲区吗  为什么它也不需要刷新呢
作者: 白金角斗士    时间: 2014-12-1 09:10
应该是这样的吧
作者: 白金角斗士    时间: 2014-12-1 09:29
应该是这样的吧
不是说,字节流不需要对缓冲区进行刷新,而字符流需要。
确切的说都需要,那么在刷新缓冲区的情况 下,就会有两种情况了。
一种为close,这个关闭了,就不可以再续写。
flush是被调用了,还可以继续再写。

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

作者: ppStudent    时间: 2014-12-1 09:37
受教了,查了api才发现,outputStream居然没有flush()方法。。
作者: SpiderManZZH    时间: 2014-12-1 22:22
lz看视频不专心哦,老毕上课都说了,字节流先于字符流存在,而且字节流不用刷新会直接存到文件,而字符流其实还是在调用字节流的功能,需要将缓冲区的数据刷新到文件中。
作者: 壹贰叁    时间: 2014-12-1 22:39
因为,字符流,底层也是用字节流来实现的,将字节暂时存在内存中,然后一次性取出。
作者: 黑马学前班    时间: 2014-12-1 23:19
缓冲区的问题吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2