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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 熊亮 于 2013-9-20 20:34 编辑
  1. package Day19_IO流;
  2. import java.io.*;
  3. public class L01_BufferedWriter {
  4.         public static void main(String[] args)throws IOException
  5.         {
  6.                 FileWriter fw = new FileWriter("F:\\bufwtest.txt");
  7.                 BufferedWriter bufw =new BufferedWriter(fw);
  8.                 for(int x=0;x<5;x++)
  9.                 {
  10.                         bufw.write("abcd"+x);
  11.                         bufw.newLine();
  12.                         bufw.flush();
  13.                 }
  14. bufw.close();
复制代码
这是毕老19_01的视频中的代码
关闭了缓冲区是不是就完全等同于关闭了该缓冲区的流对象?如果不是,有什么区别呢?

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

13 个回复

倒序浏览
bufw.flush();强调的是将内存中缓存的数据,写入到文件中(磁盘上,物理设备),bufw.close();  关闭了流,当你先关闭流,而没调用flush()方法,可能导致内存中缓存的数据没有写入到文件中,而且调用flush()后可以继续向文件中写数据,而调用了close()方法后,再调用 write() 或 flush() 将导致抛出 IOException。
回复 使用道具 举报
当调用bufw.close();方法那么就关闭了流对象,释放了资源,无法再写入数据,调用close方法之前已经调用了flush方法  void close()  关闭此流,但要先刷新它。 希望对你有帮助
         
回复 使用道具 举报
因为缓冲区和流相关联,关闭缓冲区调用close()方法会先关闭和缓冲区相关的流对象,在关闭缓冲区,即缓冲区的关闭方法close()先调用流对象的关闭方法close(),再关闭缓冲区自身
回复 使用道具 举报
是的,关闭缓冲区就是关闭调用的流对象,因为关闭缓冲区方法里面封装的就是流对象的关闭
回复 使用道具 举报
首先要清楚缓冲区和流对象的关系,那样就知道了关闭缓冲区是否等同于关闭流对象。
用个比喻来说可能比较容易理解。
不使用缓冲区的话,流对象每次操作一个数据。
就如同吃饭,这里饭就是我们要操作的数据,你要等很久才可以吃一口饭,然后继续等下一口饭。
加入缓冲区,就如同我们给饭找了个容器,我们可以吃一碗,而不是吃一口等一口。
我们吃完了把碗收起来了,这时候自然是不会有饭的,因为饭就在碗里。
就如同关闭缓冲区,流对象自然也就关闭了。
^_^,我理解的大致就是这样,希望能对你有帮助。
回复 使用道具 举报
熊亮 中级黑马 2013-9-20 20:28:56
7#
Inspur 发表于 2013-9-20 20:15
因为缓冲区和流相关联,关闭缓冲区调用close()方法会先关闭和缓冲区相关的流对象,在关闭缓冲区,即缓冲区 ...

那也就是说代码14行如果我写  fw.close(); 和  bufw.close(); 是没有区别的对吧?
回复 使用道具 举报
熊亮 中级黑马 2013-9-20 20:31:28
8#
doitforyou 发表于 2013-9-20 20:25
首先要清楚缓冲区和流对象的关系,那样就知道了关闭缓冲区是否等同于关闭流对象。
用个比喻来说可能比较容 ...

比喻很形象,大概能理解了{:soso__4705646669196236709_3:}
回复 使用道具 举报
熊亮 发表于 2013-9-20 20:28
那也就是说代码14行如果我写  fw.close(); 和  bufw.close(); 是没有区别的对吧?
...

就还是我上面所说,fw.close()关闭了。相当于没饭了你手里还拿个空碗,不太合适吧,但我没代码验证,因为要下班了。
bufw.close()关闭了,碗和饭都没了。这才符合逻辑。

回复 使用道具 举报
关闭两个都一样,其实性质是一样的,这是BufferedWriter源程序:
    public void close() throws IOException {
        synchronized (lock) {
            if (out == null) {
                return;
            }
            try {
                flushBuffer();--->在关闭缓冲流前在刷新一次数据到目标设备上。
            } finally {
                out.close();--->关闭out这个流,这个流其实我们传入的那个输出流对象。
                out = null;
                cb = null;
            }
        }
    }
所以最后你调用bufw.close()还是在BufferedWriter对象内部关闭fw流。
而你直接关闭fw.close()是不需要刷新流,因为它是一个一个即时写如到目标设备的,不用担心flush()的问题。
回复 使用道具 举报
doitforyou 来自手机 高级黑马 2013-9-20 23:55:31
11#
兜兜转转 发表于 2013-9-20 23:17
关闭两个都一样,其实性质是一样的,这是BufferedWriter源程序:
    public void close() throws IOExcepti ...

因为for循环的存在,fw.write()也是需要刷新flush()的,如果没有循环的话,close()关闭之前就会刷新。因为他是字符流对象,也需要调用底层资源。
字节流则不用刷新,因为它是按字节在底层直接完成操作。
回复 使用道具 举报
doitforyou 发表于 2013-9-20 23:55
因为for循环的存在,fw.write()也是需要刷新flush()的,如果没有循环的话,close()关闭之前就会刷 ...

fw.write(); 你确认 FileWiter(“...”)有flush()这个方法?不管是不是循环,直接调用非缓冲流写入数据不用使用flush(),而且没有这个方法,如果调用brfw.witer
()的话,就有区别了,它是在brfw内部建立一个缓冲区域,或缓冲数组,还是调用brfw.writer将数据写入到它内部的缓冲区中,并不是直接写入到目标设备上,所以,需要使用flush()。
回复 使用道具 举报
doitforyou 来自手机 高级黑马 2013-9-21 09:35:24
13#
我明天查一下,因为IO流学习的有一段时间了,我凭印象写的,记得它和字节流的区别是一个需要刷新,一个不需要。哈,以后我会确认了再回答问题,不好意思。
回复 使用道具 举报
兜兜转转 发表于 2013-9-21 07:25
fw.write(); 你确认 FileWiter(“...”)有flush()这个方法?不管是不是循环,直接调用非缓冲流写入数据不 ...

我刚刚查了下 ,FileWriter是有flush方法的,他是继承来的方法,所以方法列表里没有,你可以确认下。
我刚刚代码验证了下,不使用flush是可以的,因为close()自带刷新动作。
你如果不想关闭流的话,直接flush()也是可以的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马