黑马程序员技术交流社区

标题: 关于关闭流的一个问题 [打印本页]

作者: 清心玉质    时间: 2013-8-9 18:21
标题: 关于关闭流的一个问题
本帖最后由 清心玉质 于 2013-8-11 11:30 编辑

BufferedWriter中的close方法不是有刷新的作用吗?为什么我在下面的代码中用close不能输出,只能用flush才能看到结果呢?
import java.io.*;
class TransStreamDemo
{
public static void main(String[] args) throws IOException
{
  BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
  String line = null;
  while ((line=bufr.readLine())!=null)
  {
   if("over".equals(line))
    break;
   bufw.write(line.toUpperCase());
   bufw.newLine();
   bufw.flush();//只有用这个才能看到结果
   }
  bufr.close();
bufw.close();//不能刷新
}
}

作者: 会飞的狼    时间: 2013-8-9 18:35
在你的循环体中如果不加上flush的话,就意味着不停的读数据,而循环体外面的close是读不到的,所以你写一个数据暂时是看不见的,只有当你输入over才能一次性看到
作者: 胡智    时间: 2013-8-9 19:36
本帖最后由 胡智 于 2013-8-9 19:38 编辑

close方法是可以刷新的。楼主想要的是输入一行字符,回车以后会在屏幕上显示这一行的字符的大写形式。
  1. while ((line=bufr.readLine())!=null)
  2.   {
  3.    if("over".equals(line))
  4.     break;
  5.    bufw.write(line.toUpperCase());
  6.    bufw.newLine();
  7. //bufw.flush();//只有用这个才能看到结果
  8.    }
复制代码
循环里面的效果是,你输入一行,转换后的内容存在缓存区里面。不刷新的话,不会打印到屏幕上。你再输入一行,再存于缓存里。直到你输入over结束循环,用close()关闭流。一刷新,之前存与缓存的内容都显示出来了。
  1. import java.io.*;
  2. class TransStreamDemo
  3. {
  4. public static void main(String[] args) throws IOException
  5. {
  6.   BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  7.   BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
  8.   String line = null;
  9.   while ((line=bufr.readLine())!=null)
  10.   {
  11.    if("over".equals(line))
  12.     break;
  13.    bufw.write(line.toUpperCase());
  14.    bufw.newLine();
  15.    //bufw.flush();//只有用这个才能看到结果
  16.    }
  17.          bufr.close();
  18.         bufw.close();//不能刷新
  19. }
  20. }
复制代码
所以你想输入一行就显示一行,就要在写入数据后刷新一下。

QQ图片20130809193524.jpg (8.24 KB, 下载次数: 13)

不刷新的结果

不刷新的结果

qa.png (1.46 KB, 下载次数: 19)

刷新后的结果

刷新后的结果

作者: 清心玉质    时间: 2013-8-9 19:36
会飞的狼 发表于 2013-8-9 18:35
在你的循环体中如果不加上flush的话,就意味着不停的读数据,而循环体外面的close是读不到的,所以你写一个 ...

不是先写到缓存区中吗?close刷新关闭缓存区
作者: 会飞的狼    时间: 2013-8-9 20:34
清心玉质 发表于 2013-8-9 19:36
不是先写到缓存区中吗?close刷新关闭缓存区

你输入一个个字符串后按了回车键,并没有跳出循环啊,它要继续下一次循环,下次循环还是要你写数据,执行不到close,你按个ctrl+c就能全部输出了
作者: 清心玉质    时间: 2013-8-11 11:30
谢谢大家了!




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