这几天学习java的 I/O流,有点疑问,想请教一下大家
InputStreamReader 和OutputStreamWriter 是怎么用的?
InputStreamReader是将读取的字节流转换为字符流,为什么没有将读取的字符流转换为字节流呢?
而OutputStreamWriter是将输出的字符流转换为字节流,又为什么没有将输出的字节流转换为字符流呢?
换个角度就是:
对于所操作的源来说(如一个文件),进出的都是字节流,
那么有没有进出的都是字符流,而想对于程序也就是进出的都是字节流呢?

解决方案 »

  1.   

    DataOutputStream
    DataInputStream
    这2个是字节流
      

  2.   

    回复"
    InputStreamReader是将读取的字节流转换为字符流,为什么没有将读取的字符流转换为字节流呢?
    而OutputStreamWriter是将输出的字符流转换为字节流,又为什么没有将输出的字节流转换为字符流呢? "第一个问题我的回答是:
            InputStreamReader 是将相对于程序代码外部的数据读取进来,获得的数据是要传入到程序代码中的,如果你把读进来的变成字节流,程序就不能识别了...第二个问题我的回答是:
            其实你还是没弄明白程序和外部文件之间的数据传输过程.        两个问题都是类似的.OutputStream 以程序代码为出发点,将数据通过IO流向文件传输
                               InputStream 以文件为出发点,将数据通过IO流向程序代码传输所以相对程序向外的话,只能是程序往外写 就是Write 的操作
        相对文件的话,只能是Reader 程序把它读进来.就是Read的操作
      

  3.   

    InputStreamReader是将读取的字节流转换为字符流,为什么没有将读取的字符流转换为字节流呢?
    而 OutputStreamWriter是将输出的字符流转换为字节流,又为什么没有将输出的字节流转换为字符流呢? "
      InputStreamReader 是将相对于程序代码外部的数据读取进来,获得的数据是要传入到程序代码中的,如果你把读进来的变成字节流,程序就不能识别了...  
      

  4.   

    因为jvm最终处理的是字节,而不是字符,所以你读出来的是字节,可以转化为字符,而你写进去的可能是字符也可能是字节,但最终需要的是字节,而不是字符,所以读出来的时候是读取的字节流转换为字符流,而写进去的时候正好相反
      

  5.   


    为什么要程序识别出来呢?如果只是把读进来的数据保存下,在输出到其他地方呢?
    还是不明白,baidu下也没能找到答案
      

  6.   

    这些东西都是j2se里面的,看看java编成思想如何介绍就明白拉
      

  7.   

    字节流更底层一些,字符流是在字节流之上的东西。
    通俗一点,字节是最基本的单位。一个字符可能包含1个或2个或更多的字节。如果你要把字符流转成字节流,那么字符流里每读出一个字符,要对应字节流里的多个字节。输出流也一样也就是说,如果你将字符输出流转为字节输出流,那么你写入时,如果写入的内容不能按照指定的编码转为字符,那么结果可能是未知的。附2段代码:
    1.字符输入流转字节输入流import java.io.IOException;
    import java.io.InputStream;
    import java.io.Reader;public class ReaderInputStream extends InputStream {
    private final Reader r;
    private final String encoding;
    private byte[] buf;
    private final char[] cBuf = new char[1];
    private int len; public ReaderInputStream(Reader r, String encoding) {
    this.r = r;
    this.encoding = encoding;
    } @Override
    public int read() throws IOException {
    if (len == 0) {
    int ch = r.read();
    if (ch < 0)
    return -1;
    cBuf[0] = (char) ch;
    buf = new String(cBuf).getBytes(encoding);
    len = buf.length;
    }
    return buf[--len] & 0xFF;
    } @Override
    public void close() throws IOException {
    super.close();
    r.close();
    }
    }
    2.字符输出流转字节输出流import java.io.IOException;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.io.Writer;public class WriterOutputStream extends OutputStream {
    private final Writer w;
    private final String encoding;
    private final byte[] buf = new byte[128];
    private int size; public WriterOutputStream(Writer w, String encoding) {
    this.w = w;
    this.encoding = encoding;
    } @Override
    public void write(int b) throws IOException {
    if (size == buf.length)
    flush();
    buf[size++] = (byte) b;
    } @Override
    public void flush() throws IOException {
    super.flush();
    String s = null;
    int len;
    for (len = size; len > 0; len--) {
    try {
    s = new String(buf, 0, len, encoding);
    } catch (UnsupportedEncodingException ue) {
    continue;
    }
    break;
    }
    if (s != null) {
    w.write(s);
    size -= len;
    System.arraycopy(buf, len, buf, 0, size);
    }
    }
    }