Java IO学习3:字节-字符转换流

 

OutputStreamWriter和InputStreamReader

在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类。

OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即:将一个字符流的输出对象变成字节流的输出对象。

InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变成字符流的输入对象。

一般在操作输入输出内容就需要使用字节或字符流,但是有些时候需要将字符流变成字节流的形式,或者将字节流变为字符流的形式,所以,就需要另外一组转换流的操作类。

 

看一下OutputStreamWriter的构造方法:

public OutputStreamWriter(OutputStream out)

例如,是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。 

复制代码
 1 import java.io.File;
2 import java.io.FileOutputStream;
3 import java.io.IOException;
4 import java.io.OutputStreamWriter;
5 import java.io.Writer;
6
7 public class Test20 {
8 public static void main(String[] args) throws IOException {
9 File f = new File("d:" + File.separator+"test.txt");
10 Writer out=new OutputStreamWriter(new FileOutputStream(f));
11 out.write("Hello World!!!");
12 out.close();
13 }
14 }
复制代码

读得时候也可以用字符流形式读取字节流的对象

 

复制代码
 1 import java.io.File;
2 import java.io.FileInputStream;
3 import java.io.IOException;
4 import java.io.InputStreamReader;
5 import java.io.Reader;
6
7 public class Test21 {
8 public static void main(String[] args) throws IOException {
9 File f = new File("d:" + File.separator+"test.txt");
10 Reader input=new InputStreamReader(new FileInputStream(f));
11 char[] c=new char[1024];
12 int len=input.read(c);
13 input.close();
14 System.out.println(new String(c,0,len));
15 }
16 }
复制代码

以上操作只是以文件操作为例,OutputStreamWriter中接受的类型是OutputStream,只要是字节输出流都可以以使用字符的形式操作,InputStreamReader一样。

 

FileWriter和FileReader的说明

从JDK文档中可以 知道FileOutputStream是OutputStream的直接子类。FileInputStream也是InputStream的直接子类,但 是在字符流文件的两个操作类却有一些特殊,FileWriter并不直接是Writer的子类,而是OutputStreamWriter的子类,而 FileReader也不直接是Reader的子类,而是InputStreamReader的子类,那么从这两个类的继承关系就可以清楚的发现,不管是 使用字节流还是字符流实际上最终都是以字节的形式操作输入输出流的。也就是说,传输或者从文件中读取数据的时候,文件里真正保存的数据永远是字节。

posted @ 2012-09-27 22:04  积淀  阅读(476)  评论(0编辑  收藏  举报