PushbackInputStream

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

2.  假设一个文本文件中同时存储有ASCII码范围的英文字符与BIG5范围的中文字符。想要判断那些位置是ASCII而哪些位置是BIG5中文字符,BIG5中文字符使用两个字节来表示一个中文字,而ASCII只使用一个字节来表示英文字符。

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

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

Java代码

1.package ysu.hxy;   
2.  
3.import java.io.*;   
4.  
5.public class PushbackInputStreamDemo   
6.{   
7.    public static void main(String[] args)   
8.    {   
9.        try  
10.        {   
11.            PushbackInputStream pushbackInputStream =   
12.                new PushbackInputStream(new FileInputStream(args[0]));   
13.  
14.            byte[] array = new byte[2];   
15.  
16.            int tmp = 0;   
17.            int count = 0;   
18.  
19.            while((count = pushbackInputStream.read(array))!=-1)   
20.            {   
21.                //两个字节转换为整数    
22.                tmp = (short)((array[0] << 8) | (array[1] & 0xff));   
23.                tmp = tmp & 0xFFFF;   
24.  
25.                //判断是否为BIG5,如果是则显示BIG5中文字   
26.                if(tmp >= 0xA440 && tmp < 0xFFFF)   
27.                {   
28.                    System.out.println("BIG5:" + new String(array));   
29.                }   
30.                else  
31.                {   
32.                    //将第二个字节推回流   
33.                    pushbackInputStream.unread(array,1,1);   
34.                    //显示ASCII范围的字符   
35.                    System.out.println("ASCII: " + (char)array[0]);   
36.                }   
37.            }   
38.            pushbackInputStream.close();   
39.        }   
40.        catch(ArrayIndexOutOfBoundsException e)   
41.        {   
42.            System.out.println("请指定文件名称");   
43.        }   
44.        catch(IOException e)   
45.        {   
46.            e.printStackTrace();   
47.        }   
48.    }   
49.}  



package ysu.hxy;

import java.io.*;

public class PushbackInputStreamDemo
{
	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();
		}
	}
} 

不过这段代码好象有问题:当test.txt里面内容是:a这y是c 时,运行结果如下:

ASCII: a
BIG5: 这
ASCII: y
BIG5: 是
ASCII: c
BIG5: 乔
如果最后一个不是英文的,而是一个汉字,显示是正确的。没找到原因。

你可能感兴趣的:(C++,c,C#)