ITEEDU

Java Gossip: Reader、Writer

Reader、Writer支持Unicode标准字符集(Character set)(字节串流则只支持ISO-Latin-1 8-bit),在处理串流时,会根据系统预设的字符编码来进行字符转换,它们是抽象类别,真正您会使用其子类别,子类别通常会重新定义相关的方法。

在 PushbackInputStream 中,您读入一个含BIG5中文字及ASCII字符的文本文件,这边改写一下这个例子,使用Reader的子类别 InputStreamReader来转换读入的两个字节为汉字字符,并显示在屏幕上:

ReaderWriterDemo.java
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相关子类别,之后会于各相关主题进行介绍。