黑马程序员技术交流社区

标题: flush和close的疑问 [打印本页]

作者: 张洁    时间: 2012-6-6 21:38
标题: flush和close的疑问
学IO的时候老师说
flush();close();都会将代码“刷”进去~   
我感觉直接一个close()就够了啊,为什么还要有个flush

都是什么时候用的呢?
能给个简单的例子吗~太长容易晕哈
作者: 刘伯阳    时间: 2012-6-6 21:52
本帖最后由 刘伯阳 于 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()下。
作者: 韩国军    时间: 2012-6-6 21:58

调用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的调用,不然可能碰到奇怪的问题。


作者: 黄克帅    时间: 2012-6-6 22:03
flush(); 是不流中的数据 刷到目的地,当你掉用了这个方法的时候 ,流还存在。
close(),是关闭流,但是在关闭前会自动把流中的数据刷到目的地。
当你往一个文件中写入数据的时候,可以每读一部分数据就把数据 flush()到文件中,这样循环操作。比如读一行数据,就刷一次。
你用close()就不行,他会关闭流,除非每次循环的时候开启一个新的流,接受新的数据。
作者: 徐帅    时间: 2012-6-6 22:15
flush是刷新输出流,并强制将已有缓冲的输出字节写入该流中,而close的作用是关闭输出流并
释放与此流有关的所有系统资源,不能够再写入,而flush可以,在读取大量数据时很重要,缓
冲机制可以高效的读取,写入
作者: 陈明    时间: 2012-6-6 22:38
毕老师 上课说的 会造成数据的丢失
你每次读玩 就flush()就i会从内存到外部设备上
若你用cloase()的话那么每次只刷新一次 ,如果中图断电了 内存释放掉了,数据就丢失了
若果每次都刷新 丢的数据是一小部分
作者: 薄炳鑫    时间: 2012-6-6 22:50
flush()是将流中的数据刷入内存,但流还存在。
close()是将流关闭,在关闭流的时候将流中的数据刷入内存。流将不存在了。
作者: 张頔    时间: 2012-6-6 23:44
使用flush()将流数据刷到目标里,这时流还存活着,还可以继续使用该流进行别的操作。
close()虽然也有flush()的效果但是这时流已经死了,你如果想继续使用流的话就必须在此建立流,这样不就很浪费了。




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