大可制作:QQ群:31564239(asp|jsp|php|mysql)

Java Gossip: PushbackInputStream

PushbackInputStream拥有一个PushBack缓冲区,您从这个对象读出数据后,如果愿意的话,只要PushBack缓冲区没有满,就可以使用unread()将数据回推回串流的前端。

举个使用PushbackInputStream的例子,假设一个文字文件中同时储存有ASCII码与BIG5中文字,您希望判断出那些位置是 ASCII而那些位置是BIG5中文字的位置,BIG5中文字使用两个位元组来表示,而ASCII只使用一个。

BIG5中文为了与ASCII相容,采低位元组范围为0xA4至0xF9,而高位元组为0x40到0x7E以及0xA1至0xFE,储存时低位元组先存,再存高位元组,所以读取时只要先读到位元组是在0xA4至0xF9,就表示它可能是一个中文字的前半。

为了说明PushbackInputStream的功能,您的范例则是一次从文件中读取两个位元组,并检查其是否在0xA440与 0xFFFF之间,以简单的判断其是否为BIG5码,如果不在这个范围之内,则可能是个ASCII范围内的字节,您显示它,并将读出的第二个位元组推回串 流,以待下一次可以重新读取

  • PushbackStreamDemo.java
package onlyfun.caterpillar;

import java.io.*;

public class PushbackStreamDemo {
public static void main(String[] args) {
try {
PushbackInputStream pushbackInputStream =
new PushbackInputStream(
new FileInputStream(args[0]));
byte[] array = new byte[2];
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: " + new String(array));
}
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: 试