14.3 字符流
java.io.Reader、java.io.Writer与其子类等是处理字符流(Character
Stream)的相关类。简单地说,就是对流数据以一个字符(两个字节)的长度为单位来处理(0~65
535、0x0000~0xffff),并进行适当的字符编码转换处理,即Reader、Writer与其子类可以用于进行所谓纯文本文件的字符读/写。
14.3.1 Reader和Writer
java.io.Reader和java.io.Writer支持Unicode标准字符集(Character
Set)(字节流则只支持ISO-Latin-1
8-bit)。在处理流数据时,会根据系统默认的字符编码来进行字符转换,Reader和Writer是抽象类,在进行文本文件的字符读写时真正会使用其
子类,子类通常会重新定义相关的方法。
在范例14.15中读入一个含BIG5中文字及ASCII字符的文本文件,当时对BIG5中文字的处理是新建一个String实例。这里改写一下该
范例,使用Reader的子类 java.io.InputStreamReader来转换读入的两个字节为中文字符,并显示在屏幕上。
范例14.16 ReaderDemo.java
package onlyfun.caterpillar;
import java.io.*;
public class ReaderDemo {
public static void main(String[] args) {
try {
PushbackInputStream pushbackInputStream =
new PushbackInputStream(
new FileInputStream(args[0]));
byte[] array = new byte[2];
ByteArrayInputStream byteArrayStream =
new ByteArrayInputStream(array);
// reader会从已读的位数组中取出数据
InputStreamReader reader =
new InputStreamReader(byteArrayStream);
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: " +
(char) reader.read());
// 重置ArrayInputStream的读取光标
// 下次reader才会再重头读取数据
byteArrayStream.reset();
}
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();
}
}
}
|
对于范例14.16要注意的是Reader的read()方法,该方法每次会读入一个字符的数据,并以系统默认的编码作字符转换,然后以int类型返回,执行的结果与范例14.15是相同的。也可以直接在构建Reader的实例时,自行指定读取时的编码。例如:
InputStreamReader reader =
new InputStreamReader(byteArrayStream, "BIG5");
|
InputStream、OutputStream与Reader、Writer的区别
一、区别
InputStream、OutputStream直接操作byte数组。
Reader、Writer在操作时会进行decode、encode,会根据你的系统属性编码格式对数据进行编码或解码。但是当文件的编码格式与当前系统的不一致时,就需要做编码的转换。
二、转换
new OutputStreamWriter(FileUtils.openOutputStream(new File(filePath)), "ms932")
new InputStreamReader(FileUtils.openInputStream(new File(filePath)), "ms932")
分享到:
相关推荐
`java.io.Reader`和`java.io.InputStream`是Java标准库中处理输入数据的核心类,它们分别针对字符流和字节流提供了基础的支持。 #### `java.io.Reader`:字符流的读取器 `java.io.Reader`是所有字符输入流的超类。...
Java.io包是Java编程语言中非常重要的一个标准库,它提供了丰富的类和接口,支持多种输入/输出流的处理方式,包括文件I/O、网络通信等场景。Java.io包的核心设计思想是以流(Stream)为基础,通过不同的流类型来处理...
在Java中,IO操作主要分为字节流和字符流两大类,分别由`java.io.InputStream`和`java.io.OutputStream`以及`java.io.Reader`和`java.io.Writer`作为基类。字节流处理的是8位的字节,而字符流处理的是16位的Unicode...
在Java IO中,Decorator模式主要体现在各种InputStream、OutputStream、Reader和Writer类的使用上。例如,当我们需要对一个InputStream进行缓冲操作时,可以使用BufferedInputStream,它包装了一个原始的InputStream...
Java.io包是Java编程语言中的核心包之一,它包含了用于输入/输出操作的类和接口。这个包在Java中扮演着至关重要的角色,因为它提供了处理数据流、字符流、对象序列化、文件读写以及与操作系统交互的各种工具。在本...
在Java编程语言中,`java.io`包是用于输入/输出(I/O)操作的基础部分,包含了许多类和接口,使得开发者能够处理数据流、字符流、对象序列化、磁盘文件以及网络连接等任务。本篇文章将深入探讨`java.io`包中的关键概念...
字符流是以字符为单位读写数据的流,超类为java.io.Reader和java.io.Writer。 #### 2.1 字节流 字节流的超类是java.io.InputStream和java.io.OutputStream。文件流继承自Inputstream和OutputStream,用于连接文件...
- **字符流**(Reader和Writer)处理文本数据,而**字节流**(InputStream和OutputStream)处理原始字节。根据项目的需要,可能使用了BufferedReader和PrintWriter进行文本的读写。 - **过滤流**(FilterStream)...
20. **java.io.Reader**和**java.io.Writer**:所有字符流的基类,用于处理字符数据。 21. **java.io.DataInputStream**和**java.io.DataOutputStream**:用于读写基本数据类型的流。 22. **java.io....
根据处理的数据类型不同,Java IO流被分为两大类:字节流(byte streams)和字符流(character streams)。字节流主要处理二进制数据,而字符流则专门用于处理文本数据。 #### 二、Java IO流分类 ##### 字节流 - ...
字符流的主要基类为`java.io.Reader`和`java.io.Writer`。其中: - `java.io.Reader`类是所有字符输入流的父类。 - `java.io.Writer`类是所有字符输出流的父类。 接下来,我们将分别介绍几种常用的字符流。 #### ...
在Go语言中,`io.Reader`和`io.Writer`是两个非常基础且重要的接口,用于处理输入输出(I/O)操作。它们定义在`io`包中,是构建其他复杂I/O操作的基础。 `io.Reader`接口定义了一个单个方法: ```go type Reader ...
Java IO 包含了许多类,如InputStream、OutputStream、Reader、Writer等,它们分别用于处理字节流和字符流。字节流适用于二进制数据,而字符流适用于文本数据。Java IO 还包括Filter流,可以用来装饰其他流,添加...
writer.write("Hello, Java IO!"); writer.close(); ``` **6. 管道流与转换流** - 管道流(PipedStream)用于线程间的通信,如PipedInputStream和PipedOutputStream。 - 转换流(Wrapper Stream)用于在字节流和...
字符流处理Unicode字符,如Reader和Writer。它们又分别分为输入流和输出流,用于数据的读取和写入。 在源代码中,文件操作通常涉及以下关键类: 1. **File类**:这是处理文件和目录的基础类,提供了创建、删除、...
本文将深入探讨Java IO流中的`Reader`和`Writer`类及其常用方法,并通过具体的代码示例来展示这些方法的实际应用。 #### 一、Reader类及其方法 `java.io.Reader`是所有字符输入流的超类,用于读取文本。它的具体...
在C#编程中,System.IO命名空间提供了丰富的类和方法,用于处理文件和流操作,包括读取和写入文本文件。在这个特定的例子中,我们将关注如何使用C#的System.IO来读取和写入TXT文件,特别是通过流的方式。 首先,让...
- 抽象基类:`java.io.Reader` 和 `java.io.Writer` 提供了基于字符的读写方法。 - 实现类:如 `java.io.FileReader` 和 `java.io.FileWriter` 用于文件读写,`java.io.BufferedReader` 和 `java.io....