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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李东梁 中级黑马   /  2014-3-26 08:58  /  1087 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李东梁 于 2014-3-26 09:00 编辑
  1. public static void main(String[] args) throws IOException {

  2.                 /*
  3.                  * 获取键盘录入数据,并保存在硬盘上。
  4.                  */
  5.                
  6.                 //读取键盘。
  7.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  8.                
  9.                 //读取目的。
  10.                 BufferedWriter bufw = new BufferedWriter(new FileWriter("temp\\test2.txt"));
  11.                
  12.                 String line = null;
  13.                 while((line=bufr.readLine())!=null){
  14.                         bufw.write(line.toUpperCase());
  15.                         bufw.newLine();
  16.                         bufw.flush();
  17.                         if("over".equals(line)){
  18.                                 break;
  19.                         }
  20.                 }
  21.                
  22.                 bufw.close();
  23.                 bufr.close();

  24. //像这个里面的flush用与不用不都是样的吗?
复制代码

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
abstract  void flush()刷新该流的缓冲,abstract  void close()关闭此流,但要先刷新它。
都是是Writer类的方法。
简单来说就是字节流读取的时候要刷新,但是又分为单纯刷新和关闭刷新:
close和flush的区别:
flush刷新后,流可以继续使用,
close刷新后会关闭流。
希望对你有帮助!

评分

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

查看全部评分

回复 使用道具 举报
在使用Buffered*这种类的时候,因为类中设计有缓冲区,缓冲区是有大小限制的,只有将缓冲区存满了以后,jvm才会将数据刷入你的目的地,这个原理就能我们计算机的硬盘的工作原理是一样的,都是先缓存,然后缓存满了在写入数据到硬盘上,这样可以提高硬盘的读写速度和性能。同理代码中也是一样的,为了提高速度。                   至于什么时候需要刷新,就看你的需求了,如果你是需要每次读取完成以后,就能将数据写入到目的地,那么就需要读完了,马上就刷。               另外flush()和close()是有区别的,flush只是将缓存的数据刷入目的地,而close()是先刷,刷了以后再关闭占用的系统资源。比如我们读写硬盘数据都是操作系统帮我们完成的,他去操作的具体的硬件

评分

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

查看全部评分

回复 使用道具 举报
对于你这个问题,如果你是由键盘输入,读入文件,不容易发现flush与close的区别的。我想楼主也不够仔细吧,就从你这个方法说吧:清空test2里面的数据,运行程序,输入一行数据,再去看test里面的变化,最后over结束。注释bufw.flush()。再次清空test文件(只是为了你看着比较方便而已),运行程序,看看test里面的变化,最后over,我想这样说你应该懂了吧,flush是读一行就往test里面写入一一行,而close是知道遇到over才往test里面写。给出一个比较明显的实例:
  1.   import java.io.*;
  2.       public class Demo1 {


  3.               public static void main(String[] args) throws IOException {

  4.               /*
  5.                * 获取键盘录入数据,并保存在硬盘上。
  6.                */
  7.               
  8.               //读取键盘。
  9.               BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  10.        BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
  11.               //将目的从文件转移到控制台
  12.               //读取目的。
  13.             //  BufferedWriter bufw = new BufferedWriter(new FileWriter("test2.txt"));
  14.               
  15.               String line = null;
  16.               while((line=bufr.readLine())!=null){
  17.                       bufw.write(line.toUpperCase());
  18.                      bufw.newLine();
  19.                      bufw.flush();
  20.                     //运行两次,一次注释bufw.flush(),一次不注释,一目了然。
  21.                       if("over".equals(line)){
  22.                               break;
  23.                       }
  24.               }
  25.               
  26.               bufw.close();
  27.               bufr.close();



  28. }
  29.       }




复制代码

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
字符流写入数据时需要刷新flush()只要你操作的是文本数据,就使用就对了,
字节流不需要使用了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马