黑马程序员技术交流社区

标题: 字符流与字节流的转换疑惑 [打印本页]

作者: 刘真    时间: 2012-8-9 11:26
标题: 字符流与字节流的转换疑惑
本帖最后由 刘真 于 2012-8-9 11:32 编辑

  1. import java.io.*;

  2. class TransStreamDemo
  3. {
  4. public static void main(String[] args) throws IOException
  5. {
  6. //获取键盘录入对象。
  7. //InputStream in = System.in;

  8. //将字节流对象转成字符流对象,使用转换流。InputStreamReader
  9. //InputStreamReader isr = new InputStreamReader(in);

  10. //为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader

  11. //BufferedReader bufr = new BufferedReader(isr);


  12. //键盘的最常见写法。
  13. BufferedReader bufr =
  14. new BufferedReader(new InputStreamReader(System.in));

  15. //获取键盘输出对象out,out是字节流对象
  16. //OutputStream out = System.out;

  17. //OutputStreamWriter不是讲字符流转换成字节流吗?而out是字节流对象,何谈转换?这个地方不懂请指教
  18. //OutputStreamWriter osw = new OutputStreamWriter(out);

  19. //BufferedWriter bufw = new BufferedWriter(osw);//为什么最后得到还是字符流对象?
  20. BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

  21. String line = null;

  22. while((line=bufr.readLine())!=null)
  23. {
  24. if("over".equals(line))
  25. break;
  26. bufw.write(line.toUpperCase());
  27. bufw.newLine();
  28. bufw.flush();
  29. }

  30. bufr.close();

  31. }
  32. }
复制代码
//获取键盘输出对象out,out是字节流对象
OutputStream out = System.out;

//OutputStreamWriter不是讲字符流转换成字节流吗?而out是字节流对象,何谈转换?这个地方不懂请指教
//OutputStreamWriter osw = new OutputStreamWriter(out);

//BufferedWriter bufw = new BufferedWriter(osw);//为什么最后得到还是字符流对象?
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

本人疑惑就是上面红色标明的地方?到底是怎样把字节流转换成字符流的呢?十分不解,求指教。

作者: 胡刚涛    时间: 2012-8-9 12:04
键盘录入和输出都是字节流,但你的程序下要用到BufferedReader 和readline的方法都是字符流中的所以要先将字节流转换成字符流,
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//将键盘录入转换成字符流,运用InputStreamReader类,InputStreamReader是Reader的子类,
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));//将键盘输出转换成字符流,运用OutputStreamWriter类,OutputStreamWriter是Writer的子类。
字符流比字节流出现的晚所以在功能上比字节流多。
作者: 刘真    时间: 2012-8-9 12:11
胡刚涛 发表于 2012-8-9 12:04
键盘录入和输出都是字节流,但你的程序下要用到BufferedReader 和readline的方法都是字符流中的所以要先将 ...

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。这句话怎么解释?
不是应该是把字符转换成字节吗?
作者: 张雪磊    时间: 2012-8-9 12:17
本帖最后由 张雪磊 于 2012-8-9 12:19 编辑

import java.io.*;

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

//将字节流对象转成字符流对象,使用转换流。InputStreamReader
//InputStreamReader isr = new InputStreamReader(in);

//为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader

//BufferedReader bufr = new BufferedReader(isr);


//键盘的最常见写法。
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));

//获取键盘输出对象out,out是字节流对象
//OutputStream out = System.out;

//OutputStreamWriter不是讲字符流转换成字节流吗?而out是字节流对象,何谈转换?这个地方不懂请指教
//OutputStreamWriter osw = new OutputStreamWriter(out);

//BufferedWriter bufw = new BufferedWriter(osw);//为什么最后得到还是字符流对象?
                /*
                 我明白楼主的疑惑,其实是个方向问题,楼主带着这是个“方向问题”这几个字来理解就明白了
                  楼主应该明白键盘输入字节流转化成字符流的情况,那就先那这个例子说说
                  对于键盘录入,是字节流,你用BufferedReader字符流如操作他,当然要转换这个留。这个相信楼主明白
                  他的方向是什么呢?开始键盘输入(字节流)--->流转化(这个过程就把字节流转换成字符流了)
                                  --->然后用字符流操作
                  
                  那对于读取呢?想下面蓝色的这句代码你读取的bufw是字符流,是把System.in转换成字符流的结果,高效不说了,
                  然后最后需要把结果变成System.out打印到控制台,就是需要把字符流变成字节流System.out,这个过程
                  就是字符流转换成字节流
                  
                他的方向是:留中的字符数据--->转化流(字节流这个过程就把字符流转换成字节流了)
                --->然后就是通过System.out(字节流)打印到控制台了
               
                 说白了一个是从外往内读取字节流读取后需要把字节流转换成字符流,
                 一个是从内往外写入字节流,因为读取到的已经转换成字符流了,就需要把内部字符流转成字节流
                */

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();

}
}



作者: 刘真    时间: 2012-8-9 14:12
张雪磊 发表于 2012-8-9 12:17
import java.io.*;

class A

看了构造函数OutputStreamWriter(OutputStream out) ,OutputStreamWriter 是字符流通向字节流的桥梁
  创建使用默认字符编码的 OutputStreamWriter。
参数:
out - OutputStream
参数类型OutputStream是我最大的疑惑,想着为什么参数本身已经是字节流,怎么还转换呢?

仔细想了想桥梁两个字的含义,我理解为,只要把字节流对象传入该构造函数中,就变成字符流可以操作的对象,然后就可以用字符流的方法来操作经过包装后字节流对象。
OutputStreamWriter只是起到一个桥梁作用。这样理解可以想通,但是不知道是否理解的正确?
作者: 胡刚涛    时间: 2012-8-9 14:49
刘真 发表于 2012-8-9 12:11
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。这 ...

   OutputStreamWriter再创建对象时要接受一个输出流;
  OutputStream out=Syetem.out;//Syetem.out返回的是OutputStream的一个字类PrintStream,其中PrintStream类会自动调用平台                                             //默认的码表将字符转换成字节存储。out是一个输出流

    OutputStreamWriter osw=new OutputStreamWriter(out);
     OutputStreamWriter类中的方法可以将写入的字符转换成以字节存储起来。




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