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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王广彬 中级黑马   /  2012-8-18 00:21  /  1252 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class BufferedWriterDemo3{
        public static void main(String[] args) throws IOException{
                BufferedTest t=new BufferedTest();
                t.test();
        }
}
class BufferedTest{
        public void test()throws IOException{
                FileWriter fw=new FileWriter("D:\\哈哈.java");
                BufferedWriter buf=new BufferedWriter(fw);
                buf.write("saljfoj");            
                buf.newLine();
                buf.flush();
                buf.close();
        }
}

Writer类本身就可以把数据写到缓冲区中,使用flush()方法把数据从缓冲区中刷到硬盘上.
而BufferedWriter类的作用也是把数据写到缓冲区,再从缓冲区中把数据写到硬盘上,既然Writer类本身有这样的功能
为什么还要用BufferedWriter呢?



评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

3 个回复

正序浏览
无论使不使用BufferedWriter,当向文件中写入数据时,数据流始终先保存到一段缓冲区中,不使用BufferedWriter缓冲区为8K,BufferedWriter的缓冲区为16K,因为缓冲区更大,随之IO性能也提升,使用BufferedWriter更高效

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 杜佳瑞 于 2012-8-18 00:39 编辑

Writer类还是基于字节流的,缓冲区是暂时将一个或多个字节存起来,然后对应相应的码表,翻译成字符再存入指定文件。
而BufferedWriter其实可以看作一个加速器,参数是流对象,将流对象包装起来,加速写入。这是因为内部封装了一个缓冲区,而Write中只能一个字符一个字符的写入,所以你不需要高效的话可以不用BufferedWriter

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
BufferedWriter 效率高
和Writer         效率低
Writer  
写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类比如说:(BufferedWriter)将重写此处定义的一些方法,以提供更高的效率和/或其他功能。

BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 ('\n') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。






代码示例:
/*

缓冲区的出现是为了提高流的操作效率而出现的
所以在创建缓冲区之前,必须要先有流对象


*/
import java.io.*;
class  BufferedWriterDemo
{
        public static void main(String[] args) throws IOException
        {
                //创建一个字符写入流对象
                FileWriter fw = new FileWriter("buf.txt");

                //为了提高字符写入流效率,加入了缓冲技术.
                //只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可  
                BufferedWriter bufw = new BufferedWriter(fw);
               
                for(int x=1;x<5;x++)
                {
                        bufw.write("abcd"+x);
                        bufw.newLine();
                        bufw.flush();
                }

               
               
                //记住,只要用到缓冲区,就要记得刷新
                //bufw.flush();

                //其实关闭缓冲区,就是在关闭缓冲区中的流对象
                bufw.close();
        }
}

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马