Reader、Writer支持Unicode标准字符集(Character set)(字节串流则只支持ISO-Latin-1 8-bit),在处理串流时,会根据系统预设的字符编码来进行字符转换,它们是抽象类别,真正您会使用其子类别,子类别通常会重新定义相关的方法。
在 PushbackInputStream 中,您读入一个含BIG5中文字及ASCII字符的文本文件,这边改写一下这个例子,使用Reader的子类别 InputStreamReader来转换读入的两个字节为汉字字符,并显示在屏幕上:
package onlyfun.caterpillar;
import java.io.*;
public class ReaderDemo {
public static void main(String[] args) {
try {
PushbackInputStream pushbackInputStream =
new PushbackInputStream(
new FileInputStream(args[0]));
byte[] array = new byte[2];
ByteArrayInputStream byteArrayStream =
new ByteArrayInputStream(array);
// reader会从已读的位数组中取出数据
InputStreamReader reader =
new InputStreamReader(byteArrayStream);
int tmp = 0;
int count = 0;
while((count = pushbackInputStream.read(array))
!= -1) {
// 两个字节转换为整数
tmp = (short)((array[0] << 8) |
(array[1] & 0xff));
tmp = tmp & 0xFFFF;
// 判断是否为BIG5,如果是则显示BIG5中文字
if(tmp >= 0xA440 && tmp < 0xFFFF) {
System.out.println("BIG5: " +
(char)reader.read());
// 重置ArrayInputStream的读取光标
// 下次reader才会再重头读取数据
byteArrayStream.reset();
}
else {
// 将第二个字节推回串流
pushbackInputStream.unread(array, 1, 1);
// 显示ASCII范围的字符
System.out.println("ASCII: " +
(char)array[0]);
}
}
pushbackInputStream.close();
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("请指定文件名称");
}
catch(IOException e) {
e.printStackTrace();
}
}
}
假设的文本文件中有以下的文字:"这T是e一s个t测试" ,执行结果会是:
BIG5: 这 ASCII: T BIG5: 是 ASCII: e BIG5: 一 ASCII: s BIG5: 个 ASCII: t BIG5: 测 BIG5: 试 ASCII: ! EOF?
InputStreamReader可以用字节串流中取出字节数据,并进行字符处理动作,关于Reader、Writer相关子类别,之后会于各相关主题进行介绍。