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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张洁 中级黑马   /  2012-6-6 21:38  /  9700 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

学IO的时候老师说
flush();close();都会将代码“刷”进去~   
我感觉直接一个close()就够了啊,为什么还要有个flush

都是什么时候用的呢?
能给个简单的例子吗~太长容易晕哈

评分

参与人数 1黑马币 +3 收起 理由
赵志勇 + 3 希望你看视频要认证一些。

查看全部评分

7 个回复

倒序浏览
本帖最后由 刘伯阳 于 2012-6-6 22:02 编辑

BufferedOutStream是一个缓冲输出流,flush方法是当你想把BufferedOutStream中的数据立即输出时,就调用。
close方法是关闭流,当你关闭了之后,BufferedOutStream中的数据也就随之被输出,里面就没有东西可以再存放了。
所以当你想结束输出时,close()就可以了,它会自动调用一下flush()然后关闭。
但是当你刷了之后以后还要继续往里面装东西时,就不能close(),因为close()之后流就不存在了。
byte[]   buf   =   new   byte[5];
                 while   ((s   =   fis.read(buf))   >   0   ){
                         fos.write(buf,0,s);
                         fos.flush();                       //强行刷新缓冲区,清空数据
                 }
fos.close();                                               //关闭流
还有,flush()作用是把缓冲区的数据强行输出。如果你不flush就可能会没有真正输出,也就是里面可能有遗存。
相反没有flush不代表它就没有输出,只是可能没有完全输出。调用flush是保证缓存清空输出。
所以记得在close()之前先flush()下。

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1

查看全部评分

回复 使用道具 举报

调用IO输出流的close的close方法时会先调用flush方法再调用close方法(这是我在练习IO时发现的,当时我没有flush,用完流后也没有close,这当然不是好的编程习惯了)
可以通过下面的例子来证明
/*
通过FileReader和FileWriter类实现文件的复制
*/
import java.io.*;
public class TestFileReader {
        public static void main(String[] args){
                FileReader fr = null;
                FileWriter fw = null;
                int c;
                try {
                        fr = new FileReader("D:\\SourceCode \\HelloWorld.java");
                        fw = new FileWriter("D:\\SourceCode\\HelloWorld.bak");
                        while((c=fr.read()) != -1) {
                                        fw.write(c);
                        }
                        //fw.flush();
                } catch(FileNotFoundException e){
                        System.out.println("文件没有找到");
                        System.exit(-1);
                } catch(IOException e1) {
                        System.out.println("读取文件发生错误");
                        System.exit(-1);
                } finally {
                        try {
                                fr.close();
                                //fw.close();
                        } catch(IOException e3) {
                                System.out.println("请查看其他相应错误");
                                System.exit(-1);
                        }
                }
        }
}
说明:不调用flush或close方法HelloWorld.bak文件的内容为空
      若调用flush或close方法HelloWorld.bak文件的内容为HelloWorld.java的内容


flush方法即使在缓冲区中没有满的情况下,也会将缓冲区内的内容强制写到外设,也就是所谓的刷新。
flush方法不是对所有的OutputStream子类起作用,只对那些使用缓冲区的OutputStream子类有效。
调用close方法,系统在关闭这个流前,最好将缓冲区的内容写到外设上。
所以你在程序中要注意对flush的调用,不然可能碰到奇怪的问题。

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
flush(); 是不流中的数据 刷到目的地,当你掉用了这个方法的时候 ,流还存在。
close(),是关闭流,但是在关闭前会自动把流中的数据刷到目的地。
当你往一个文件中写入数据的时候,可以每读一部分数据就把数据 flush()到文件中,这样循环操作。比如读一行数据,就刷一次。
你用close()就不行,他会关闭流,除非每次循环的时候开启一个新的流,接受新的数据。
回复 使用道具 举报
flush是刷新输出流,并强制将已有缓冲的输出字节写入该流中,而close的作用是关闭输出流并
释放与此流有关的所有系统资源,不能够再写入,而flush可以,在读取大量数据时很重要,缓
冲机制可以高效的读取,写入
回复 使用道具 举报
毕老师 上课说的 会造成数据的丢失
你每次读玩 就flush()就i会从内存到外部设备上
若你用cloase()的话那么每次只刷新一次 ,如果中图断电了 内存释放掉了,数据就丢失了
若果每次都刷新 丢的数据是一小部分
回复 使用道具 举报
flush()是将流中的数据刷入内存,但流还存在。
close()是将流关闭,在关闭流的时候将流中的数据刷入内存。流将不存在了。
回复 使用道具 举报
使用flush()将流数据刷到目标里,这时流还存活着,还可以继续使用该流进行别的操作。
close()虽然也有flush()的效果但是这时流已经死了,你如果想继续使用流的话就必须在此建立流,这样不就很浪费了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马