java 位流处理4

PushbackInputStream

    java.io.PushbackInputStream拥有一个PushBack缓冲区,从PushbackInputStream读出数据后,只要PushBack缓冲区没有满,就可以使用unread()将数据推回流的前端

 

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

 

 

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

 

    为了说明 PushbackInputStream的功能,在范例14.15中一次从文件中读取两个字节,并检查两个字节合并后的整数值是否在0xA440与 0xFFFF之间,这样可以简单地判断其两个字节合并后是否为BIG5码。如果是BIG5码则使用这两个字节产生String实例以显示汉字字符;如果不 在这个范围之内,则可能是个ASCII范围内的字符,您可以显示第一个字节的字符表示,并将读出的第二个字节推回流,以待下一次可以重新读取

 

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PushbackInputStream;

public class PushbackStreamDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		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 {
					// 将第二个字节流推回
					if (count == 2) {
						pushbackInputStream.unread(array, 1, 1);
					}
					// 显示ASII范围的字符
					System.out.println("ASCII:" + (char) array[0]);
				}

			}
			pushbackInputStream.close();
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("请指定文件名称");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 

假设指定的文本文件test.txt中有以下的文字:这T是e一s个t测试。则执行的结果如下:

java onlyfun.caterpillar. PushbackStreamDemo test.txt

BIG5: 这

ASCII: T

BIG5: 是

ASCII: e

BIG5: 一

ASCII: s

BIG5: 个

ASCII: t

BIG5: 测

BIG5: 试

 

源文件地址:http://hi.baidu.com/mdbing/blog/item/c477a338d81009c7d56225fb.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值