【Java基础】-I/O-字符流

一、概述

Java的I/O体系分为字节流 和字符流:

  • 字节流 :以**字节(byte)**为单位,处理所有类型数据(如图片、音频、文本),核心类为InputStream和OutputStream。
  • 字符流 :以字符(char)为单位,专门处理文本数据 ,支持字符编码转换,核心类为Reader和Writer。

字符流特点

  1. 面向文本数据(如.txt文件、日志、配置文件),自动处理字符编码(如UTF-8、GBK)。
  2. 基于Reader(读取)和Writer(写入),继承自这两个抽象类的子类用于具体操作。
  3. 通常使用缓冲流(BufferedReader/BufferedWriter)提升效率。

二、核心抽象类:Reader和Writer

1. Reader(字符输入流)

  • 作用:从数据源读取字符到程序。
  • 常用方法:
java 复制代码
int read();                // 读取一个字符,返回其Unicode值,到末尾返回-1
int read(char[] cbuf);     // 读取多个字符到数组,返回实际读取的字符数
int read(char[] cbuf, int off, int len);  // 读取指定长度的字符到数组偏移位置
void close();              // 关闭流


### 2. Writer(字符输出流)
**作用**:将字符数据写入目标。
**常用方法**:

```java
void write(int c);         // 写入一个字符
void write(String str);    // 写入字符串
void write(char[] cbuf);   // 写入字符数组
void write(char[] cbuf, int off, int len);  // 写入数组的部分字符
void flush();              // 刷新缓冲,确保数据写入
void close();              // 关闭流

注意事项:

  • 字符流操作字符,自动处理编码,适合文本;字节流处理原始字节,适合二进制数据。
  • 必须调用close()或flush()确保数据写入完毕,推荐使用try-with-resources自动关闭。

三、文件字符流:FileReader与FileWriter

  1. FileReader
  • **作用:**从文件中读取字符数据。
  • 构造方法:
java 复制代码
FileReader(String filePath);     // 通过文件路径创建
FileReader(File file);           // 通过File对象创建
  • **注意:**默认使用系统编码(可能跨平台乱码),不建议直接使用,推荐用InputStreamReader指定编码。
  • 示例:
java 复制代码
try (FileReader fr = new FileReader("text.txt")) {
    int ch;
    while ((ch = fr.read()) != -1) {
        System.out.print((char) ch);
    }
} catch (IOException e) {
    e.printStackTrace();
}
  1. FileWriter
  • 作用:向文件写入字符数据。
  • 构造方法:
java 复制代码
FileWriter(String filePath);          // 覆盖写入
FileWriter(String filePath, boolean append);  // append为true时追加写入
FileWriter(File file);                 // 覆盖写入
FileWriter(File file, boolean append);  // 追加写入
  • 注意:写入后需调用close()或flush(),否则数据可能未保存到文件。
  • 示例:
java 复制代码
try (FileWriter fw = new FileWriter("output.txt")) {
    fw.write("Hello, Character Stream!");
    fw.write("\nJava IO is powerful.");  // 写入换行和文本
} catch (IOException e) {
    e.printStackTrace();
}

四、字符流的缓冲流:BufferedReader与BufferedWriter

  • 作用:提升读写效率,减少I/O次数。
  • 用法:
java 复制代码
// 使用BufferedReader包装FileReader
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {  // 按行读取
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

// 使用BufferedWriter包装FileWriter
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
    bw.write("Buffered Writing.");
    bw.newLine();  // 写入换行(跨平台)
    bw.flush();    // 手动刷新缓冲
} catch (IOException e) {
    e.printStackTrace();
}

五、字符流与字节流的转换:InputStreamReader/OutputStreamWriter

  • 场景:需要在字节流和字符流之间转换,并指定字符编码(如处理文本文件时)。
  • 示例
java 复制代码
// 将字节输入流转换为字符输入流(指定UTF-8编码)
InputStreamReader isr = new InputStreamReader(new FileInputStream("utf8.txt"), "UTF-8");
// 将字符输出流包装为缓冲流,并写入文件(指定编码)
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8"));

六、使用技巧与注意事项

  • 编码一致性:读写文件时,确保使用相同的字符编码(如UTF-8),避免乱码。
  • 缓冲流必用:处理文本文件时优先使用BufferedReader/BufferedWriter提升性能。
  • 资源管理:推荐try-with-resources自动关闭流,避免资源泄露。
  • 按行读取:使用BufferedReader.readLine()高效处理文本文件。
  • 避免直接使用FileReader/FileWriter:因无法指定编码,推荐用InputStreamReader和OutputStreamWriter代替。
  • 大文件处理:分块读取,避免一次性加载到内存。

七、总结

  • 字符流专用于文本处理,支持编码转换,比字节流更高效。
  • FileReader/FileWriter用于简单文本读写,但需注意编码问题。
  • 结合缓冲流和转换流可实现高性能、跨平台的文本I/O。
  • 字符流与字节流的选择依据:文本用字符流,二进制用字节流。
相关推荐
Raas1006 分钟前
AI网关能做语义缓存吗?MAI Gateway(魔芋企业级AI网关)实战能力深度解读
java·后端·spring
weixin199701080168 分钟前
《1688消息服务落地方案:alibaba.message.* 与 Webhook 回调的可靠性与重试策略》(附Python源码)
开发语言·python
天空鸟_时光不老13 分钟前
13-亮点提炼:把技术说辞翻译成业务价值
java·spring boot·spring·spring cloud·mybatis
小蒜学长17 分钟前
基于SpringBoot+Vue的租房管理系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·租房管理
ZHOUPUYU17 分钟前
PHP 9.0 前瞻:下一代 PHP 会带来哪些新功能?
android·开发语言·php
某不知名網友18 分钟前
ROS2 核心通信:话题发布与订阅详解
开发语言·c++
一只专注api接口开发的技术猿18 分钟前
Open‑Claw 实战|告别页面逆向,快速搭建电商商品监控与数据分析完整方案
大数据·数据库·python·数据挖掘·数据分析
C++ 老炮儿的技术栈19 分钟前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c
洋就在江州23 分钟前
gitlab-cicd 离线集成——springboot-cicd (非docker形式,shell形式)
java·spring boot·后端·ci/cd·gitlab·gitlab-runner
CEZ30 分钟前
JeeWMS 开源 WMS 全景导览:一套 Java 仓库管理系统从单据流到代码入口的阅读地图
java·开源