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范围内的字节,您显示它,并将读出的第二个位元组推回串
流,以待下一次可以重新读取
。
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: 试
|
|