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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 余清兰 于 2012-7-29 15:54 编辑

学到读取转换流的时候看到:InputStreamReader字节流通向字符流的桥梁(这句话不难理解)。
OutputStreamWirter字符流通向字节流的桥梁,这个刚开始理解起来有点模糊,下面是在学习过程中总结的一些想法,欢迎大家补充。
这两句话如何理解?通过实例来说明。比如获取键盘录入数据,分三步完成。
InputStream in = System.in;
System.in通常对应的是键盘的输入,返回的是字节输入流,通过InputStream in接收这个键盘录入对象。
分析:如果你一次录入了多个数据,用InputStream对象的read方法一次只能获取一个字节,要多次调用read方法才能把一次录入的数据读完,速度比较慢,想把一次录入的数据也一次性读取。就想到了readLine方法,可是这个方法是BufferedReader对象操作字符串的方法,如何能使用readLine方法?
这时就要分两步来实现:1、先把InputStream字节输入流转换成字符输入流,通过InputStreamReader的构造方法,把InputStream对象作为参数传入,它使用字符集编码(若没指定字符集,则用系统默认的字符集)将接收进来的字节将其解码为字符,这就是字节通向字符的桥梁。
InputStreamReader isr = new InputStreamReader(in);
2、因InputStream和BufferedReader同属于一个体系(Reader类),就可通过BufferedReader的构造方法将InputStream传入,进行包装其加强功能,这样就可通过BufferedReader的readLine方法一次读一行,从而提高效率。
BufferedReader br = new BufferedReader(isr);
以上三步可简写为:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
过程:
字符流到内存中<-----BufferedReader<-----InputStreamReader<-----System.in(返回的是字节流)
2、写入转换流:OutputStreamWirter字符流通向字节流的桥梁。
比如将数据写出到控制台
输出到控制台的常见写法
       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
这段代码需要反向推理,数据源是内存,目的是控制台。结合上一步的字符流到内存中,通过BufferedWriter调用从父类Writer继承过来的write方法把内存中的字符流写出到OutputStreamWriter对象里,OutputStreamWriter调用write方法,此时系统会自动调用编码转换器将字符编码成字节,最终以字节流出输,通过System.out功能输出到控制台上,从而完成了字符流通向字节流的过程。用BufferedWriter装饰OutputStreamWriter让字符流高效写出,从而输出到控制台上(System.out System.out是标准输出流,对应的是控制台,输出的就是字节对象)
内存中的字符流-----> BufferedWriter----->OutputStreamWriter-----> System.out----->字节流输出

评分

参与人数 1黑马币 +15 收起 理由
田向向 + 15 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马