这几天学习java的 I/O流,有点疑问,想请教一下大家
InputStreamReader 和OutputStreamWriter 是怎么用的?
InputStreamReader是将读取的字节流转换为字符流,为什么没有将读取的字符流转换为字节流呢?
而OutputStreamWriter是将输出的字符流转换为字节流,又为什么没有将输出的字节流转换为字符流呢?
换个角度就是:
对于所操作的源来说(如一个文件),进出的都是字节流,
那么有没有进出的都是字符流,而想对于程序也就是进出的都是字节流呢?
InputStreamReader 和OutputStreamWriter 是怎么用的?
InputStreamReader是将读取的字节流转换为字符流,为什么没有将读取的字符流转换为字节流呢?
而OutputStreamWriter是将输出的字符流转换为字节流,又为什么没有将输出的字节流转换为字符流呢?
换个角度就是:
对于所操作的源来说(如一个文件),进出的都是字节流,
那么有没有进出的都是字符流,而想对于程序也就是进出的都是字节流呢?
解决方案 »
- *********求助啊!!关于 JDBC 的问题***********
- JAVA基础题·菜鸟啊·不会编的·
- 将int型数据a转换为String的话,使用String.valueOf(a)和(new Integer(a)).toString()这2中方法有什么区别?
- eclipse+tomcat4.1?
- 急求:如何编译含“import netscape.javascript.JSObject;”的java文件 ?
- 有用Java做图形工作流的兄弟吗?交流一下如何?
- JAVA 高手再请进!
- Oracle9i 9.0.1的JDBC Drivers 可以给Oracle 8.0.5使用马?
- 与java高手过招
- jboss高手请进,有关jdbc的问题!报错:"对只转发结果集的无效操作"(急死我了!!!愿以200分送上!)
- api document
- java 下swing的开发
DataInputStream
这2个是字节流
InputStreamReader是将读取的字节流转换为字符流,为什么没有将读取的字符流转换为字节流呢?
而OutputStreamWriter是将输出的字符流转换为字节流,又为什么没有将输出的字节流转换为字符流呢? "第一个问题我的回答是:
InputStreamReader 是将相对于程序代码外部的数据读取进来,获得的数据是要传入到程序代码中的,如果你把读进来的变成字节流,程序就不能识别了...第二个问题我的回答是:
其实你还是没弄明白程序和外部文件之间的数据传输过程. 两个问题都是类似的.OutputStream 以程序代码为出发点,将数据通过IO流向文件传输
InputStream 以文件为出发点,将数据通过IO流向程序代码传输所以相对程序向外的话,只能是程序往外写 就是Write 的操作
相对文件的话,只能是Reader 程序把它读进来.就是Read的操作
而 OutputStreamWriter是将输出的字符流转换为字节流,又为什么没有将输出的字节流转换为字符流呢? "
InputStreamReader 是将相对于程序代码外部的数据读取进来,获得的数据是要传入到程序代码中的,如果你把读进来的变成字节流,程序就不能识别了...
为什么要程序识别出来呢?如果只是把读进来的数据保存下,在输出到其他地方呢?
还是不明白,baidu下也没能找到答案
通俗一点,字节是最基本的单位。一个字符可能包含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);
}
}
}