黑马程序员技术交流社区

标题: 转换流的两个桥梁的理解,键盘录入和输出控制台原理理解 [打印本页]

作者: 余清兰    时间: 2012-7-29 15:52
标题: 转换流的两个桥梁的理解,键盘录入和输出控制台原理理解
本帖最后由 余清兰 于 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----->字节流输出





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