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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张志阳 中级黑马   /  2012-4-3 12:36  /  1916 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

BufferedWriter中,操作结束关闭缓冲区就是在关闭缓冲区中的流对象;如果直接关闭流对象会怎样啊?有木有区别啊?

2 个回复

倒序浏览
用这个给你举例:
FileOutputStream fos = new FileOutputStream("f:\william");

OutputStreamWriter osw = newOutputStreamWriter(fos);

BufferedWriter bw = newBufferedWriter(osw);

bw.write("hello world!");

看看源码:JDK中BufferedWriter流关闭时的代码

  public void close() throws IOException {

    synchronized (lock) {

        if (out == null) {

       return;

        }

        try {

            flushBuffer(); //注意

        } finally {

            out.close();

            out = null;

            cb = null;

        }

    }

    }

}、在close一个流的时候,它会执行一次flush操作,因此,当把BufferedWriter.close()时,它会把自身的内容,一次性flush出去。如果此时OutputStreamWriter已经关闭了,那么BufferedWriter自身的内容流不出去,因此会抛出java.io.IOException: Stream closed。

希望对你有帮助
回复 使用道具 举报
直接关闭流,close();关闭流,但会先刷新
因为流对象最终使用的是本地系统中的资源完成的动作。
所以使用完了系统资源后,一定会释放。所以close的动作一定要有。

BufferedWriter先刷新缓冲区中的数据到目的地,然后关闭缓冲区中的流资源。
两者不同的是一个有缓冲区,一个没有缓冲区,最后的动作都是一样的把流关闭了。
如果你使用了缓冲区,直接关闭缓冲区就可以了,就不用再关闭了。

//创建字符输出流对象,并创建存储数据的目的地。
//                FileWriter fw = new FileWriter("c:"+ToolSeparator.FILE_SEPARATOR+"buf.txt");
                FileWriter fw = new FileWriter("buf.txt");
                //为了提高写入效率,定义了字符输出流缓冲区,并和指定的字符输出流对象关联。
                BufferedWriter bufw = new BufferedWriter(fw);
               
                // 使用fw的方法可以。既然有了缓冲区对fw进行效率的提高。
                // 可以使用缓冲区的高效方法,来操作数据。其实底层使用还是fw的方法。只不过对其高效了。
               
                //bufw.write("hahahas");//数据被写入到了缓冲区中。相当于水已经到了杯子中.
               
               
               
                //bufw.write(ToolSeparator.LINE_SEPARATOR+"hehiehie");
                //bufw.newLine();//获取系统自带的换行符进行换行。
                //bufw.write("xxixiixi");
               
                //bufw.flush();//刷新缓冲区。记住:只要用到缓冲区,记得一定要刷新。
               
                for(int x=0;x<4;x++){
                        bufw.write(x+"hahahaha");
                        bufw.newLine();
                        bufw.flush();
                }
               
                bufw.close();//先刷新缓冲区中的数据到目的地,然后关闭缓冲区中的流资源。
                //fw.close();        //所以fw就不用关闭了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马