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: 乔
如果最后一个不是英文的,而是一个汉字,显示是正确的。没找到原因。
分享到:
相关推荐
在Java编程语言中,`PushbackInputStream`是一个用于处理输入流的类,它提供了一种回退(或称为退格)的功能。这个类是`java.io`包的一部分,主要用于在读取数据后允许将数据“推回”到流中,以便后续的读取操作可以...
((PushbackInputStream) this.in).unread(buf, len - n, n); } else { byte[] b = new byte[1]; int ret = in.read(b); } } return charsRead; } } ``` 在这个类中,`MultiMemberGZIPInputStream` 扩展了 `...
PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream()); String response = StreamTool.readLine(inStream); System.out.println(response); String[] items = response...
在Java编程中,UTF-8编码是一个非常常见且广泛使用的字符编码格式,它能支持全球大部分语言的字符表示。然而,UTF-8有一个特殊特性,那就是它可以带有Byte Order Mark(BOM),这是一个特殊的字节序列,用于标识数据...
`PushbackInputStream`:提供了“回推”功能,可以将已读取但还未处理的字节放回流的开头。 9.2.3 字符流类 字符流主要涉及`Reader`和`Writer`类。`Reader`是所有字符输入流的抽象基类,`Writer`是所有字符输出流的...
- **PushbackInputStream**: 允许将数据推回到输入流中,以便重新读取。 - **PushbackReader**: 字符流版本的`PushbackInputStream`。 这些FilterInputStream及其相应的输出流(如`DataOutputStream`、`...
PushbackInputStream允许“回退”或退回已读取的字节,这在需要重新处理某些数据时非常有用。PipedStream允许两个线程间通过管道进行数据传输。 7. 文件复制示例 下面是一个使用Java I/O流进行文件复制的例子: ```...
PushbackInputStream PushbackInputStream 为另一个输入流添加性能,即“推回 (push back)”或“取消读取 (unread)”一个字节的能力。 PushbackReader 允许将字符推回到流的字符流 reader。 RandomAccessFile 此类...
实际的示例代码可能会包含这些概念的实际应用,也可能涵盖其他高级特性,如管道流(PipedInputStream和PipedOutputStream),或者装饰模式下的过滤流(如CheckedInputStream和PushbackInputStream)。要深入了解,你需要...
PushbackInputStream允许将已读取的数据重新送回输入流。此外,ObjectInputStream可以反序列化由ObjectOutputStream序列化的对象,SequenceInputStream则可以将多个InputStream连接起来,按顺序读取。 Reader和...
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'"); ...
除了基本的输入输出流,还有一些特殊类型的流,如LineNumberInputStream提供行号功能,PushbackInputStream允许回退已读取的字节,而SequenceInputStream允许合并多个输入流。PrintStream是实用工具类,它可以格式化...
还有**推回流**(PushBackInputStream)允许你将已读取的字节重新送回流中,以便再次读取。 对于对象的序列化和反序列化,Java 有 `ObjectInputStream` 和 `ObjectOutputStream`,它们可以将对象转换为字节流并反之...
* PushbackInputStream OutputStream的类型: * ByteArrayOutputStream * FileOutputStream * PipedOutputStream * FilterOutputStream * ByteArrayOutputStream * DataOutputStream * BufferedOutputStream * ...
inp = new PushbackInputStream(inp, 8); } if (POIFSFileSystem.hasPOIFSHeader(inp)) { return new HSSFWorkbook(inp); } else { return new XSSFWorkbook(OPCPackage.open(inp)); } } ``` 2. **提供扩展...
16. FilterInputStream类是InputStream的子类,它的子类包括DataInputStream、BufferedInputStream、PushbackInputStream等,因此不是这些子类的是D)FileInputStream。 17. 在Applet中,要强制重画当前窗口,可以...
这就是FilterStream和PushbackInputStream等过滤流的作用,它们可以串联多个流,实现数据预处理、错误检测等功能。例如,DataInputStream和DataOutputStream可以对基本数据类型进行高效的读写。 管道流...
- **`PushbackInputStream`**:允许数据重新推回到流中。 #### 四、字符流详解 字符流主要用于文本数据的处理,更加高效且易于操作。 ##### 1. 基础字符流 - **`CharArrayReader`**:从一个字符数组创建输入流。...
- `PushbackInputStream` 和 `PushbackReader`:允许将数据推回输入流以便重读。 7. 文件观察和监听: - `FileAlterationObserver` 和 `FileAlterationListener`:监控文件系统的变化,例如文件创建、修改和删除...