这几天学习java的 I/O流,有点疑问,想请教一下大家

killming 2010-08-28 09:58:55
这几天学习java的 I/O流,有点疑问,想请教一下大家
InputStreamReader 和OutputStreamWriter 是怎么用的?
InputStreamReader是将读取的字节流转换为字符流,为什么没有将读取的字符流转换为字节流呢?
而OutputStreamWriter是将输出的字符流转换为字节流,又为什么没有将输出的字节流转换为字符流呢?
换个角度就是:
对于所操作的源来说(如一个文件),进出的都是字节流,
那么有没有进出的都是字符流,而想对于程序也就是进出的都是字节流呢?
...全文
187 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
renjy1123 2010-08-28
  • 打赏
  • 举报
回复
这些东西都是j2se里面的,看看java编成思想如何介绍就明白拉
killming 2010-08-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shehun 的回复:]
InputStreamReader是将读取的字节流转换为字符流,为什么没有将读取的字符流转换为字节流呢?
而 OutputStreamWriter是将输出的字符流转换为字节流,又为什么没有将输出的字节流转换为字符流呢? "


InputStreamReader 是将相对于程序代码外部的数据读取进来,获得的数据是要传入到程序代码中的,如果你把读进来的变成字节流,程序就不能识别了...
……
[/Quote]

为什么要程序识别出来呢?如果只是把读进来的数据保存下,在输出到其他地方呢?
还是不明白,baidu下也没能找到答案
Paul_ss 2010-08-28
  • 打赏
  • 举报
回复
受教了,很不错!
jays1235 2010-08-28
  • 打赏
  • 举报
回复
路过帮顶!!
xuxianyue 2010-08-28
  • 打赏
  • 举报
回复
没有进出都是字符流的,网络中传输都是字节形式的,也就是字节流式底层的,
字符最终要转化为字节形式。
gesanri 2010-08-28
  • 打赏
  • 举报
回复
因为jvm最终处理的是字节,而不是字符,所以你读出来的是字节,可以转化为字符,而你写进去的可能是字符也可能是字节,但最终需要的是字节,而不是字符,所以读出来的时候是读取的字节流转换为字符流,而写进去的时候正好相反
shehun 2010-08-28
  • 打赏
  • 举报
回复
InputStreamReader是将读取的字节流转换为字符流,为什么没有将读取的字符流转换为字节流呢?
而 OutputStreamWriter是将输出的字符流转换为字节流,又为什么没有将输出的字节流转换为字符流呢? "


InputStreamReader 是将相对于程序代码外部的数据读取进来,获得的数据是要传入到程序代码中的,如果你把读进来的变成字节流,程序就不能识别了...

jason69181 2010-08-28
  • 打赏
  • 举报
回复
回复"
InputStreamReader是将读取的字节流转换为字符流,为什么没有将读取的字符流转换为字节流呢?
而OutputStreamWriter是将输出的字符流转换为字节流,又为什么没有将输出的字节流转换为字符流呢? "

第一个问题我的回答是:
InputStreamReader 是将相对于程序代码外部的数据读取进来,获得的数据是要传入到程序代码中的,如果你把读进来的变成字节流,程序就不能识别了...

第二个问题我的回答是:
其实你还是没弄明白程序和外部文件之间的数据传输过程.

两个问题都是类似的.OutputStream 以程序代码为出发点,将数据通过IO流向文件传输
InputStream 以文件为出发点,将数据通过IO流向程序代码传输

所以相对程序向外的话,只能是程序往外写 就是Write 的操作
相对文件的话,只能是Reader 程序把它读进来.就是Read的操作
VincentTung 2010-08-28
  • 打赏
  • 举报
回复
我当时学的时候也糊涂,你看看老马讲IO的那一段,或许会有点帮助,堆管道的那段
kunger309 2010-08-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liukun309 的回复:]
DataOutputStream
DataInputStream
这2个是字节流
[/Quote]
错了,这个是读数据和写数据的
kunger309 2010-08-28
  • 打赏
  • 举报
回复
DataOutputStream
DataInputStream
这2个是字节流
fairloveangel 2010-08-28
  • 打赏
  • 举报
回复
对于io来讲
首先你要了解 有哪些流 分别是干什么用的啊
流的分类 1 输入/输出流 2 节点流/处理流 3 字节流/字符流
ababab222 2010-08-28
  • 打赏
  • 举报
回复
字节就是计算机中保存的二进制代码,一般计算机保存数据是以字节为单位的,但是一个汉字要用两个字符表示,所以必要时要将两个字节转换成一个字符
「已注销」 2010-08-28
  • 打赏
  • 举报
回复
字节流更底层一些,字符流是在字节流之上的东西。
通俗一点,字节是最基本的单位。一个字符可能包含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);
}
}
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧