字符输入流(Character Input Stream)是用于从输入源(如文件、网络连接等)读取字符数据的流对象。在 Java 中,主要使用 java.io.Reader
及其子类来实现字符输入流的操作。
FileReader
是 Java 中用于读取字符数据的文件输入流类,它继承自 InputStreamReader
类,并实现了 Closeable
和 AutoCloseable
接口。FileReader
可以读取存储在文件中的字符数据。
import java.io.FileReader;
import java.io.IOException;
try (FileReader reader = new FileReader("input.txt")) {
int data;
while ((data = reader.read()) != -1) {
char ch = (char) data;
System.out.print(ch);
}
} catch (IOException e) {
e.printStackTrace();
}
在上述示例中,首先创建了一个 FileReader
对象,并传入要读取的文件名(例如 "input.txt")。使用 read()
方法读取文件中的字符数据,每次读取一个字符,直到读取到文件末尾(返回 -1)为止。读取的字符被强制转换为 char
类型,并打印到控制台。
FileReader
类的原理是基于底层的字节流和字符集编码的转换。
在 Java 中,底层的文件输入流是 FileInputStream
,它是一个字节流,用于从文件中读取字节数据。FileReader
类将 FileInputStream
转换为字符流,以便可以按字符读取文件内容。
FileReader
类实际上继承了 InputStreamReader
类,而 InputStreamReader
类是字符流与字节流之间的桥梁,通过它可以将字节流转换为字符流。FileReader
类内部会创建一个 InputStreamReader
对象,并指定一个默认的字符集编码(通常为平台默认编码)来进行字节到字符的解码。
当我们使用 FileReader
的 read()
方法时,FileReader
内部会调用其父类 InputStreamReader
的 read()
方法,这个方法会从底层的 FileInputStream
中读取字节数据,然后将字节数据根据指定的字符集编码方式进行解码转换成字符,最后返回读取到的字符数据。
需要注意的是,在字符流的读取过程中,字节数据会被缓冲区(Buffer)逐步加载进来,并根据需要转换为字符。这样可以提高读取的效率,减少每次读取的系统开销。