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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jagon 中级黑马   /  2014-3-14 18:06  /  2409 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
将字符流转换成字节流:OutputStreamWriter
*/
import java.io.*;
class  OutputStreamWriterDemo1
{
public static void main(String[] args) throws IOException
{
  //获取键盘录入对象。
  InputStream in = System.in;
  //将字节流对象转成字符流对象,使用转换流。InputStreamReader,把字节流对象in传进去
  InputStreamReader isr = new InputStreamReader(in);    //对象in由字节流变成了字符流isr
  //为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader
  BufferedReader bufr = new BufferedReader(isr);     //创建缓冲区对象,将字符流对象isr传入
   
  OutputStream out = System.out;     //创建一个输出流对象out,已经是屏幕输出,所以不用再写输出语句
  OutputStreamWriter osw = new OutputStreamWriter(out);     //对象out由字符流变成了字节流osw

  BufferedWriter bufw = new BufferedWriter(osw);   //创建缓冲区对象,将字节流对象osw传入
  String line = null;
  while((line=bufr.readLine())!=null)
  {
   if("over".equals(line))
    break;
   bufw.write(line.toUpperCase());
   bufw.newLine();     //进行换行操作
   bufw.flush();       //将缓冲区数据进行刷新操作
  }
  bufr.close();      //关闭缓冲区资源
}
}

问题:
请看一下我红色部分的注释对吗?为什么要把字符流转换成字节流,不是输出吗?输出的话,又不是存储,只有存储的时候才把字符流转换成字节流,我怎么越想越糊涂,谁能帮我解释一下啊!多谢指教!

评分

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

查看全部评分

3 个回复

倒序浏览
错了,是字节流转为字符流

评分

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

查看全部评分

回复 使用道具 举报
daoyua 发表于 2014-3-14 18:07
错了,是字节流转为字符流

哈哈,我想明白了,System.out ,就是一个输出流,但是每次只能输出一个字节,而这个OutputStreamWriter,就是对System.out这个输出流进行了包装,使其功能增强,这样一次就可以输出一行数据,哎呀,总算迷过来了,多谢啊!
回复 使用道具 举报
正确的理解应该是这样的:
/*
将字符流转换成字节流:OutputStreamWriter
*/
import java.io.*;

class  OutputStreamWriterDemo1
{
        public static void main(String[] args) throws IOException
        {
                //获取键盘录入对象。
                InputStream in = System.in;

                //将字节流对象转成字符流对象,使用转换流。InputStreamReader,把字节流对象in传进去
                InputStreamReader isr = new InputStreamReader(in);    //对象in由字节流变成了字符流isr

                //为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader
                BufferedReader bufr = new BufferedReader(isr);     //创建缓冲区对象,将字符流对象isr传入

                               
                OutputStream out = System.out;     //创建一个输出流对象out,已经是屏幕输出,所以不用再写输出语句
                OutputStreamWriter osw = new OutputStreamWriter(out);     //新建一个转换流(对out对象进行包装,osw是字符流)
                BufferedWriter bufw = new BufferedWriter(osw);   //创建缓冲区对象,将字符流对象osw传入

                String line = null;

                while((line=bufr.readLine())!=null)
                {
                        if("over".equals(line))
                                break;
                        bufw.write(line.toUpperCase());    //将每行字符串(字符流)转换成字节(字节流),并变成大写
                        bufw.newLine();     //进行换行操作
                        bufw.flush();       //将缓冲区数据进行刷新操作,输出结果
                }

                bufr.close();      //关闭缓冲区资源

        }
}

/*
(1)类 InputStreamReader:将字节流转换成字符流,是字节流通向字符流的桥梁;
     构造方法:InputStreamReader(InputStream in)
                      创建一个使用默认字符集的 InputStreamReader。
(2)类OutputStreamWriter:将字符流转换成字节流,是子字符流通向字节流的桥梁;
         构造方法:OutputStreamWriter(OutputStream out)
                      创建使用默认字符编码的 OutputStreamWriter。
         理解:实质上OutputStreamWriter就是一个转换流(将字符流转换成字节流),就是对输出流System.in的一个包装,
               System.in 一次只能读一个字节,而进行包装之后,一次可以读一行,非常方便;
(3)system.in是输出流
     system.out是输出流
(4)PrintStream是OutputStream的子类,可以使用父类接收子类对象;
(5)理解:字符转字节
     我们往文件中录入的都是字符,但写入文件的字符都是以字节的形式存在的,即录入的是字符,但在硬盘上保存的是字节,这就是
         字符转字节;
(6)录入和输出的数据都要是字节流,缓冲区存储的可以是字符流;
(7)本例实质上就是自己定义了一个输出的操作方法;
*/
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马