字符输入流

简介: 字符输入流

字符输入流(Character Input Stream)是用于从输入源(如文件、网络连接等)读取字符数据的流对象。在 Java 中,主要使用 java.io.Reader 及其子类来实现字符输入流的操作。

FileReader 是 Java 中用于读取字符数据的文件输入流类,它继承自 InputStreamReader 类,并实现了 CloseableAutoCloseable 接口。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 对象,并指定一个默认的字符集编码(通常为平台默认编码)来进行字节到字符的解码。

当我们使用 FileReaderread() 方法时,FileReader 内部会调用其父类 InputStreamReaderread() 方法,这个方法会从底层的 FileInputStream 中读取字节数据,然后将字节数据根据指定的字符集编码方式进行解码转换成字符,最后返回读取到的字符数据。

需要注意的是,在字符流的读取过程中,字节数据会被缓冲区(Buffer)逐步加载进来,并根据需要转换为字符。这样可以提高读取的效率,减少每次读取的系统开销。


相关文章
java流是指在Java中用来读写数据的一组有序的数据序列,它可以将数据从一个地方带到另一个地方。java流分为输入流和输出流,输入流是从源读取数据的流,而输出流是将数据写入到目的地的流。Java流又可以分为字节流和字符流,字节流读取的最小单位是一个字节(1byte=8bit),而字符流一次可以读取一个字符(1char = 2byte = 16bit)。Java流还可以分为节点流和处理流,节点流是直接从一个源读写数据的流(这个流没有经过包装和修饰),处理流是在对节点流封装的基础上的一种流。
120 0
|
5月前
|
存储 自然语言处理 Java
day17-缓冲流&转换流&序列化流&打印流&Properties(二)
day17-缓冲流&转换流&序列化流&打印流&Properties
58 1
|
5月前
day17-缓冲流&转换流&序列化流&打印流&Properties(三)
day17-缓冲流&转换流&序列化流&打印流&Properties
57 1
|
安全 Java
字节数组流和数据流
字节数组流和数据流
71 0
|
5月前
|
存储
day17-缓冲流&转换流&序列化流&打印流&Properties(一)
day17-缓冲流&转换流&序列化流&打印流&Properties
72 0
|
5月前
IO流:字符输入流Reader的超详细用法及底层原理
IO流:字符输入流Reader的超详细用法及底层原理
|
11月前
|
NoSQL Java Redis
字节数组流ByteArrayOut(In)putStream使用详解
字节数组流ByteArrayOut(In)putStream使用详解
53 0
|
SQL JavaScript 前端开发
开始使用流
Java 8 中的 Stream 俗称为流,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念 Stream 用于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作 Stream API 借助于 Lambda 表达式,极大的提高编程效率和程序可读性 同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势 通过下面的例子我们可以初步体会到使用 Stream 处理集合的便利性
46 1
I/O流
IO流:I的全称是Input,O的全称是Output。表示读取,流可以看做是程序传输数据的通道。 作用:解决程序请求资源,输出资源的问题。
52 0
|
C语言 C++ 开发者
C++输入流和输出流介绍
C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。在此基础上,学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案: 使用 scanf()、gets() 等函数从键盘读取数据,使用 printf()、puts() 等函数向屏幕上输出数据; 使用 fscanf()、fgets() 等函数读取文件中的数据,使用 fprintf()、fputs() 等函数向文件中写入数据。 要知道,C 语言的这套 I/O 解决方案也适用于 C++ 程序,但 C++ 并没有“偷懒”,它自己独立开发了一套全新的 I/O 解决方案,其中就包含
77 0