黑马程序员技术交流社区

标题: 关于输出转换流OutputStreamWriter的问题 [打印本页]

作者: 吴扬    时间: 2012-7-1 11:21
标题: 关于输出转换流OutputStreamWriter的问题
InputStreamReader这个类是将字节流转换成字符流,这个很好理解。那OutputStreamWriter这个类按理来说也是将字节流转换成字符流。为什么API上说是字符流通向字节流的桥梁,有点不太理解,而且在毕老师的视频中有下面的代码:
    OutputStream out = System.out;
    OutputStreamWriter osw = new OutputStreamWriter(out);
    BufferedWriter bufw = new BufferedWriter(osw);
这个BufferedWriter在实例化对象的时候接收的是Writer的子类对象作为参数,那么更加说明了OutputStreamWriter这个类应该是一个字符流对象才对!
为什么说它是将字符流转换成字节流的类呢?
作者: 车风波    时间: 2012-7-1 11:53
OutputStreamWriter 是字节流转到字符流吧。正好跟InputStreamReader相反。
作者: 陆强强    时间: 2012-7-1 11:58
本帖最后由 陆强强 于 2012-7-1 12:02 编辑

InputStreamReader意思是由InputStream类型的流转向Reader类型的流
InputStreamReader()的括号里面是字节流,转成字符流,因为读取是从文件到流;
OutputStreamWriter是由OutputStream转向writer,
OutputStreamWriter()里面是字符流,写入是由流到文件。
api文档所指的是我们传入流对象参数,以及返回的流对象,也就是由()内的流到外面,所以就正好相反了。
作者: 赵志勇    时间: 2012-7-1 12:06
我是这样理解的,既然是起到桥梁的作用,肯定是起到沟通的作用。
可以这么想想,桥的两边是过往的来自不同村庄的人们,他们的方向也是不同的。假设左边的是从A村到B村,右边是从B村到A村,那么字符转换流就可以想想成桥了。
桥的左边是将输入的字节流到字符流,即InputStreamReader的作用;而桥的右边是另一个方向的,输出的字符流到字节流即OutputStreamWriter的作用。字符流是B村庄,字节流是A村庄。
楼主不妨画个图,稍微好理解点。
作者: 张天天    时间: 2012-7-1 14:21
好好学一下装饰模式就好了,Sysout.out实际上是一个输出流,缓冲流包装一个输出流很正常啊,至于你说的那个桥梁就是把它转化为字节流了啊下面是我学习室写的程序
package io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class DataOutputStreamtest1 {
       
        public static void main(String[] args) throws IOException {
                DataOutputStream  dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("f:/java.txt")));//装饰模式
                byte  b = 3;
                int a = 5;
                float fl = 1.49f;
                boolean bo = false;
               
                dos.write(b);
                //dos.write(a);
                dos.writeInt(a);
                dos.writeFloat(fl);
                dos.writeBoolean(bo);
               
                dos.close();
               
                InputStream is = new FileInputStream("f:/java.txt");
               
                int length ;
                byte[]  buffer = new byte[300];
               
                if(-1!= (length = is.read(buffer,0,300)));
               
                String str = new String(buffer,0,length);
               
                System.out.println(str);
                is.close();
               
                //读和写的顺序一定要保持严格一致
                DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("f:/java.txt")));
                System.out.println(dis.readByte());
                System.out.println(dis.readInt());
            System.out.println(dis.readFloat());
                System.out.println(dis.readBoolean());
                dis.close();
               
               
        }

}

作者: 杨锦    时间: 2012-7-1 15:06
老毕视频里讲三个明确的时候就有讲什么时候用到InputStreamReader和OutputStreamWriter,特别是讲到键盘录入的时候有强调,你可以再看一遍




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