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. }  
[java]  view plain  copy
  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. }  

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

ASCII: a
BIG5: 这
ASCII: y
BIG5: 是
ASCII: c

BIG5: 乔

注意:回退输入流的主要精髓是’回滚‘功能,在不破坏输入流的前提下试探性读取流内容!

你可能感兴趣的:(IO流)