黑马程序员技术交流社区

标题: 关于IO缓冲区的问题 [打印本页]

作者: 肖琦    时间: 2012-7-27 08:29
标题: 关于IO缓冲区的问题
  1. FileWriter fw = new FileWriter("test.txt");
  2.                     for (int i = 0; i < 10*1024; i++) {
  3.                                 fw.write('a');
  4.                    }
  5.                    Thread.sleep(20000);
  6.                 /*
  7.                  * 趁线程睡觉的20秒钟时间,我到文件夹打开test.txt一看,已经有8192字节的数据了,此时fw还没有close.
  8.                  * 这是否说明FileWriter类的内部已经有一个8129字节的缓冲区?
  9.                  * 如果是这样,那么使用缓冲区大小小于8k的BufferedWriter还有意义吗?                  
  10.                  */
  11.                    fw.close();
  12.                 /*
  13.                  *而且,在毕老师的视频里,我见到如下的代码片段:(出于简便,没有做异常处理)
  14.                  */
  15.                 BufferedReader bufr = new BufferedReader(new FileReader("a.txt)"));
  16.                 BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
  17.                 String line = null;
  18.                 while((line=bufr.readLine())!=null){
  19.                                 bufw.write(line);
  20.                                 bufw.newLine();
  21.                                 bufw.flush();//每新增一行就刷掉缓冲区,这样是否有违缓冲区的初衷?
  22. }
复制代码

作者: 柳雷    时间: 2012-7-27 08:56
对于第一个问题,我做了一个测试
  1. public class Liu {

  2.          public static void main(String[] args){
  3.              FileWriter fw=null;
  4.             //FileReader fr;
  5.             try{
  6.                    fw=new FileWriter("D://a.txt");
  7.                    for(int i=0;i<100000;i++)
  8.                         fw.write('a');
  9.                 }
  10.             catch(IOException e){   
  11.             }
  12.        }
  13.    }
复制代码
运行程序后,文件创建了,而且文件中有了内容,我们可以断定,在这个缓冲区满了之后。不用调用flush方法,java会自动将保存在缓冲区的内容写入到磁盘上。
之后又编了一个取得字符个数程序:
  写入10万个a, 最后保存起来的是98304个a, 在反复多次试验中,我发现了当我写入8193个字符时,文件中最后会保存8192个字符,而当写入的字符小于8192时,文件中不会有任何东西。所以java中提供的缓冲区大小应该为8KB。
    经过实验我们可以看出:无论使不使用BufferedWriter,当向文件中写入数据时,数据流始终先保存到一段缓冲区中,当写入的数据流大于8KB(使用BufferedWriter包装后是16K)而没有进行刷新流操作时,JAVA会自动刷新流,将流写入到文件中。
对于问题二:每新增一行就刷掉缓冲区
这是因为如果数据写入中间发生异常,停留在缓冲区的数据将会丢失。


作者: 胡文凡    时间: 2012-7-27 09:13
BufferedReader bufr = new BufferedReader(new FileReader("a.txt)"));
               BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
                String line = null;
                while((line=bufr.readLine())!=null){
                                bufw.write(line);
                                bufw.newLine();
                                bufw.flush();//每新增一行就刷掉缓冲区,这样是否有违缓冲区的初衷?
作者: 胡文凡    时间: 2012-7-27 09:16
BufferedReader bufr = new BufferedReader(new FileReader("a.txt)"));
                BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
//将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
                String line = null;
                while((line=bufr.readLine())!=null){
                                bufw.write(line);
                                bufw.newLine();
                                bufw.flush();//每新增一行就刷掉缓冲区,这样是否有违缓冲区的初衷?
实际上创建的时候可以指定其大小
BufferedReader(Reader in, int sz)
          创建一个使用指定大小输入缓冲区的缓冲字符输入流。
一般情况下默认的就可以,如果太小在调用readLine()是自动增长,但是这个增加是需要额外的花费的。如果频繁增加更加影响效率。





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