`
cin_ie
  • 浏览: 47317 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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: 乔
如果最后一个不是英文的,而是一个汉字,显示是正确的。没找到原因。

分享到:
评论
1 楼 marshaldong 2012-06-15  
问题在2个方面:一是当只读到一个英文字母时上次读取的array[1]会作为此次的array[1],所以会出现像你这种情况,多打一个汉字;二是当你的文件末尾是至少2个英文字母时你的代码会限入死循环,并不断打出最后一个字母,因为你的read 操作始终会读到array[0],不会返回-1.
解决的办法是在每次打出字母或汉字后将array[1]清零,并在进入循环时判断array[1],如果array[1]==0,则直接打出array[0],并退出while循环。

相关推荐

    java中的回退流1

    在Java编程语言中,`PushbackInputStream`是一个用于处理输入流的类,它提供了一种回退(或称为退格)的功能。这个类是`java.io`包的一部分,主要用于在读取数据后允许将数据“推回”到流中,以便后续的读取操作可以...

    java解压linux上的压缩文件gz格式文件

    ((PushbackInputStream) this.in).unread(buf, len - n, n); } else { byte[] b = new byte[1]; int ret = in.read(b); } } return charsRead; } } ``` 在这个类中,`MultiMemberGZIPInputStream` 扩展了 `...

    android 上传文件

    PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream()); String response = StreamTool.readLine(inStream); System.out.println(response); String[] items = response...

    Java解决UTF-8的BOM问题

    在Java编程中,UTF-8编码是一个非常常见且广泛使用的字符编码格式,它能支持全球大部分语言的字符表示。然而,UTF-8有一个特殊特性,那就是它可以带有Byte Order Mark(BOM),这是一个特殊的字节序列,用于标识数据...

    彻底明白 Java 语言中的IO系统

    - **PushbackInputStream**: 允许将数据推回到输入流中,以便重新读取。 - **PushbackReader**: 字符流版本的`PushbackInputStream`。 这些FilterInputStream及其相应的输出流(如`DataOutputStream`、`...

    java输入输出流 流式输入与输出

    PushbackInputStream允许“回退”或退回已读取的字节,这在需要重新处理某些数据时非常有用。PipedStream允许两个线程间通过管道进行数据传输。 7. 文件复制示例 下面是一个使用Java I/O流进行文件复制的例子: ```...

    JDK_API_1_6

    PushbackInputStream PushbackInputStream 为另一个输入流添加性能,即“推回 (push back)”或“取消读取 (unread)”一个字节的能力。 PushbackReader 允许将字符推回到流的字符流 reader。 RandomAccessFile 此类...

    文件字节IO流例子代码.rar

    实际的示例代码可能会包含这些概念的实际应用,也可能涵盖其他高级特性,如管道流(PipedInputStream和PipedOutputStream),或者装饰模式下的过滤流(如CheckedInputStream和PushbackInputStream)。要深入了解,你需要...

    IO流体系继承结构图_动力节点Java学院整理

    PushbackInputStream允许将已读取的数据重新送回输入流。此外,ObjectInputStream可以反序列化由ObjectOutputStream序列化的对象,SequenceInputStream则可以将多个InputStream连接起来,按顺序读取。 Reader和...

    javaIO详细讲解+详细案例

    PushbackInputStream p = new PushbackInputStream(new FileInputStream("test.txt"), 1); int ch = 0; while ((ch = p.read()) != -1) { if (ch == 'a') { p.unread(ch); System.out.println("回退了一个'a'"); ...

    JavaIO流学习总结.pdf

    除了基本的输入输出流,还有一些特殊类型的流,如LineNumberInputStream提供行号功能,PushbackInputStream允许回退已读取的字节,而SequenceInputStream允许合并多个输入流。PrintStream是实用工具类,它可以格式化...

    JAVA数据流的概述.doc

    还有**推回流**(PushBackInputStream)允许你将已读取的字节重新送回流中,以便再次读取。 对于对象的序列化和反序列化,Java 有 `ObjectInputStream` 和 `ObjectOutputStream`,它们可以将对象转换为字节流并反之...

    IO流文档InputStream / OutputStream

    * PushbackInputStream OutputStream的类型: * ByteArrayOutputStream * FileOutputStream * PipedOutputStream * FilterOutputStream * ByteArrayOutputStream * DataOutputStream * BufferedOutputStream * ...

    POI2与POI3差异及解决excel2003和excel2007兼容性研究报告-V1.1.docx

    inp = new PushbackInputStream(inp, 8); } if (POIFSFileSystem.hasPOIFSHeader(inp)) { return new HSSFWorkbook(inp); } else { return new XSSFWorkbook(OPCPackage.open(inp)); } } ``` 2. **提供扩展...

    大学生《JAVA》期末20套训练试卷(含答案,精心整理版).pdf

    16. FilterInputStream类是InputStream的子类,它的子类包括DataInputStream、BufferedInputStream、PushbackInputStream等,因此不是这些子类的是D)FileInputStream。 17. 在Applet中,要强制重画当前窗口,可以...

    Javaio流思维导图

    这就是FilterStream和PushbackInputStream等过滤流的作用,它们可以串联多个流,实现数据预处理、错误检测等功能。例如,DataInputStream和DataOutputStream可以对基本数据类型进行高效的读写。 管道流...

    Java IO口解析(初级)

    - **`PushbackInputStream`**:允许数据重新推回到流中。 #### 四、字符流详解 字符流主要用于文本数据的处理,更加高效且易于操作。 ##### 1. 基础字符流 - **`CharArrayReader`**:从一个字符数组创建输入流。...

    commons io 源代码

    - `PushbackInputStream` 和 `PushbackReader`:允许将数据推回输入流以便重读。 7. 文件观察和监听: - `FileAlterationObserver` 和 `FileAlterationListener`:监控文件系统的变化,例如文件创建、修改和删除...

    Java IO 流的操作

    - `PushbackInputStream` 允许读取的数据被“推回”到流中,以便再次读取。 6. Propertity类: - `Properties` 类用于处理属性列表(键值对),常见于配置文件的读写。 在实际编程中,我们通常会结合使用这些流...

Global site tag (gtag.js) - Google Analytics