406. Java 文件操作基础 - 字符与二进制流

文章目录

  • [406. Java 文件操作基础 - 字符与二进制流](#406. Java 文件操作基础 - 字符与二进制流)
    • [1️⃣ 概述](#1️⃣ 概述)
    • [2️⃣ Writing Characters using `OutputStreamWriter`](#2️⃣ Writing Characters using OutputStreamWriter)
      • [🔑 讲解](#🔑 讲解)
    • [3️⃣ Reading Characters using `InputStreamReader`](#3️⃣ Reading Characters using InputStreamReader)
      • [🔑 讲解](#🔑 讲解)
    • [4️⃣ 小结](#4️⃣ 小结)

406. Java 文件操作基础 - 字符与二进制流

1️⃣ 概述

在 Java I/O API 中,类分为两大类:

  • 字符流(Reader / Writer):处理文本数据
  • 字节流(InputStream / OutputStream):处理二进制数据

虽然字符流通常用于文本文件,但在应用程序中也常需要将字符写入二进制文件。

Java 提供了两个关键类来实现这一点:

  • InputStreamReader:从字节流读取字符
  • OutputStreamWriter:向字节流写入字符

这两个类都是 装饰器(Decorator)模式 的例子,它们依赖底层的字节流,并提供字符处理功能。


2️⃣ Writing Characters using OutputStreamWriter

java 复制代码
import java.nio.file.*;
import java.io.*;

public class WriteCharToBinary {
    public static void main(String[] args) throws IOException {
        String message = "From fairest creatures we desire increase,\n" +
                "That thereby beauty's rose might never die,\n" +
                "But as the riper should by time decease\n" +
                "His tender heir might bear his memory:\n" +
                "But thou, contracted to thine own bright eyes,\n" +
                "Feed'st thy light's flame with self-substantial fuel,\n" +
                "Making a famine where abundance lies,\n" +
                "Thyself thy foe, to thy sweet self too cruel.\n" +
                "Thou that art now the world's fresh ornament,\n" +
                "And only herald to the gaudy spring,\n" +
                "Within thine own bud buriest thy content,\n" +
                "And, tender churl, mak'st waste in niggardly.\n" +
                "Pity the world, or else this glutton be,\n" +
                "To eat the world's due, by the grave and thee.";

        Path path = Paths.get("sonnet.txt");

        try (OutputStream outputStream = Files.newOutputStream(path);
             OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8")) {

            writer.write(message);

        } catch (IOException e) {
            e.printStackTrace();
        }

        long size = Files.size(path);
        System.out.println("size = " + size);
    }
}

🔑 讲解

  1. OutputStreamWriter 装饰 OutputStream
    • 将字节流转换为字符流
    • 可以指定字符集(Charset)
  2. try-with-resources 保证关闭顺序
    • 输出流和字符写入器都会在退出时自动 flush()close()
    • 避免因缓冲区未刷新导致文件内容丢失
  3. 效果
    • 会在 files/sonnet.txt 创建一个文本文件
    • 控制台输出文件大小,例如:size = 609

3️⃣ Reading Characters using InputStreamReader

java 复制代码
import java.nio.file.*;
import java.io.*;
import java.util.stream.*;
import java.util.*;

public class ReadCharFromBinary {
    public static void main(String[] args) {
        Path path = Path.of("files/sonnet.txt");
        String sonnet = null;

        try (InputStream inputStream = Files.newInputStream(path);
             InputStreamReader reader = new InputStreamReader(inputStream);
             BufferedReader bufferedReader = new BufferedReader(reader);
             Stream<String> lines = bufferedReader.lines()) {

            // 使用流将每行文本合并为一个完整字符串
            sonnet = lines.collect(Collectors.joining("\n"));

        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("sonnet = \n" + sonnet);
    }
}

🔑 讲解

  1. InputStreamReader 装饰 InputStream
    • 将字节流转换为字符流
  2. BufferedReader 装饰 InputStreamReader
    • 提供按行读取功能
    • 内部使用缓冲,提高读取性能
  3. 使用 Stream API
    • BufferedReader.lines() 返回 Stream<String>
    • 结合 Collectors.joining("\n") 可以轻松把所有行合并
  4. try-with-resources
    • 自动关闭 InputStream、Reader、BufferedReader 和 Stream
    • 保证资源安全
  5. 效果
    • 控制台输出完整文本内容,与写入文件的内容一致

4️⃣ 小结

  • OutputStreamWriter / InputStreamReader 是处理字符与字节混合 I/O 的关键工具
  • 装饰者模式
    • OutputStreamReader / InputStreamReader → 装饰字节流
    • BufferedReader → 进一步装饰,提供额外功能(按行读取、流式操作)
  • try-with-resources 确保所有流和资源正确关闭
  • 字符流与字节流组合 非常灵活:
    • 可用于写文本到二进制文件
    • 可用于读取二进制文件中的字符
相关推荐
caimouse2 小时前
reactos编码规范
c语言·开发语言
xieliyu.6 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
love530love6 小时前
LiveTalking 数字人项目 Windows 部署完全指南(EPGF 架构)
人工智能·windows·python·架构·livetalking·epgf
遇事不決洛必達6 小时前
【Python基础】GIL 锁是什么及其对爬虫的影响
爬虫·python·线程·进程·gil锁
明夜之约6 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee6 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Jinkxs6 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
辣机小司6 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
CryptoPP7 小时前
快速对接东京证券交易所API数据:实战指南与代码示例
开发语言·人工智能·windows·python·信息可视化·区块链
ZC跨境爬虫7 小时前
跟着 MDN 学JavaScript day_7:数学运算与逻辑判断实战测试
开发语言·前端·javascript·学习·ecmascript