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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 HM朱蛟 于 2013-4-16 02:09 编辑

OutputStreamWriter 和BufferedWriter都是继承的  java.io.Writer   都是代表一个字符流,前者是字节输出流转成字符输出 流,后者是一个字符输出流的增强装饰类

他们都有flush方法
OutputStreamWriter.flush()
          刷新该流的缓冲。
BufferedWriter.flush()
         刷新该流的缓冲。

那么为什么该例中使用
osw.flush();        //经过测试,是这句出了问题  和 bw.flush 产生了截然不同的运行结果

于是心生疑惑,他们的区别在哪儿啊,他们操作的流不是一个吗?

求来个形象的解释 {:soso_e101:}     希望得到同学们的指点   哥们儿先谢了

代码如下:
  1. import java.io.*;

  2. class Run
  3. {
  4.         public static void sop(Object obj)
  5.         {
  6.                 System.out.println(obj);   
  7.         }           

  8.         public static void main(String[] args) throws IOException
  9.         {        
  10.          /*
  11.          //接收字节流        
  12.          InputStream is = System.in;
  13.          
  14.          //转成字符流
  15.          InputStreamReader isr = new InputStreamReader(is);
  16.          
  17.          //利用字符流的增强类
  18.          BufferedReader br = new BufferedReader(isr);
  19.          */
  20.          
  21.          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));         
  22.          //--------------------------------------------------------
  23.          
  24.          
  25.          BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
  26.          /*
  27.          OutputStream os = System.out;
  28.          
  29.          OutputStreamWriter osw = new OutputStreamWriter(os);
  30.          
  31.          BufferedWriter bw = new BufferedWriter(osw);
  32.          */
  33.          String s = null;
  34.          //调用行读取函数
  35.          while((s=br.readLine())!=null)// 返回个字符串
  36.          {
  37.                         if("over".equals(s))
  38.                          break;
  39.                         
  40.       bw.write(s.toUpperCase());//直接将字符写入硬盘
  41.       bw.newLine();//跨平台的换行
  42.       bw.flush();//注意,写操作必须刷新。刷新很重要
  43.       
  44.                         /*
  45.                         为什么这样不行?
  46.                         osw.write(s.toUpperCase());//这句写是可以的
  47.                         bw.newLine();
  48.                         osw.flush();        //经过测试,是这句出了问题
  49.                         
  50.                         分析:
  51.                         osw是字节流->OutputStream
  52.                         
  53.                         我查了OutputStream的API:
  54.                         void flush()
  55.           刷新此输出流并强制写出所有缓冲的输出字节。
  56.          
  57.       这里bw.flush和osw.flush有什么不同之处么?   
  58.                         */
  59.          }
  60.         }
  61. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

4 个回复

倒序浏览
InputStreamReade 是一个读取字符的流他flush一个一个字符往程序上读的,读完后才刷新   BufferedReader 是一个缓冲区 是一批一批的读,读完才刷新
回复 使用道具 举报
我这里运行时可以的。没有什么问题。

检查一下,是不是你的bw在使用的时候,将另一个流的bw当成这个bw了
package day1;

import java.io.*;

class ChatDemo
{
        public static void sop(Object obj)
        {
                System.out.println(obj);   
        }         

        public static void main(String[] args) throws IOException
        {      
        
         
         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));         
         
         OutputStream os = System.out;
         
         OutputStreamWriter osw = new OutputStreamWriter(os);
         
         BufferedWriter bws = new BufferedWriter(osw);
         
         String s = null;
        
         while((s=br.readLine())!=null)// 返回个字符串
         {
                        if("over".equals(s))
                         break;
                        
                        
                        
                        osw.write(s.toUpperCase());//这句写是可以的
                        bws.newLine();
                        osw.flush();        //经过测试,是这句出了问题
         
         }
        }
}

我这里运行很好

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
谢谢同学指点
回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马