402. Java 文件操作基础 - 读取二进制文件

文章目录

  • [402. Java 文件操作基础 - 读取二进制文件](#402. Java 文件操作基础 - 读取二进制文件)
    • [1️⃣ 背景说明](#1️⃣ 背景说明)
    • [2️⃣ 读取二进制文件示例](#2️⃣ 读取二进制文件示例)
      • [🔹 说明](#🔹 说明)
    • [3️⃣ 转换为字符流读取(可选)](#3️⃣ 转换为字符流读取(可选))
    • [4️⃣ 总结](#4️⃣ 总结)

402. Java 文件操作基础 - 读取二进制文件

1️⃣ 背景说明

  • 二进制文件(Binary File)与文本文件不同,它存储的数据不是可读字符,而是原始字节。
  • 读取二进制文件时,使用 InputStream ,写入二进制文件时使用 OutputStream
  • 对二进制文件,不能用 readLine() 直接读取(它是字符流方法)。如果想逐行读取,可以将字节转换为字符(需知道编码)。

2️⃣ 读取二进制文件示例

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

public class BinaryFileReadExample {

    public static void main(String[] args) {
        Path file = Paths.get("example.bin"); // 二进制文件路径

        // try-with-resources 自动关闭流
        try (InputStream in = Files.newInputStream(file)) {

            // 将输入流包装成 BufferedInputStream 提高效率
            BufferedInputStream bis = new BufferedInputStream(in);

            byte[] buffer = new byte[1024]; // 每次读取 1024 字节
            int bytesRead;

            while ((bytesRead = bis.read(buffer)) != -1) {
                // bytesRead 表示本次实际读取的字节数
                for (int i = 0; i < bytesRead; i++) {
                    System.out.printf("%02X ", buffer[i]); // 以十六进制打印
                }
                System.out.println();
            }

        } catch (IOException x) {
            System.err.println("读取文件异常: " + x);
        }
    }
}

🔹 说明

  1. Files.newInputStream(file) 返回一个 未缓冲的 InputStream
  2. 使用 BufferedInputStream 可以提高读取效率,减少 I/O 调用次数。
  3. 每次读取固定大小的字节数组(buffer),直到返回 -1 表示文件结束。
  4. 可将字节数组打印、保存或进行其他二进制处理。

3️⃣ 转换为字符流读取(可选)

如果二进制文件是文本数据,想按行读取,可像这样:

java 复制代码
try (InputStream in = Files.newInputStream(file);
     BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"))) {

    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }

} catch (IOException x) {
    System.err.println("读取文本文件异常: " + x);
}
  • InputStreamReader 将字节流转换为字符流,指定编码(如 UTF-8)。
  • BufferedReader 提供 readLine() 方法,可按行读取文本数据。

4️⃣ 总结

  • InputStream vs Reader
    • InputStream:读取原始字节 → 二进制文件
    • Reader:读取字符 → 文本文件
  • 缓冲流 BufferedInputStream / BufferedReader 提高效率
  • try-with-resources 自动关闭流,防止资源泄漏
  • 循环读取 :用 read(buffer)readLine() 控制循环,处理大文件
相关推荐
nanxun8861 天前
记一次诡异的 Docker 容器"串包"故障排查
java
金銀銅鐵1 天前
[Python] 从《千字文》中随机挑选汉字
后端·python
用户1563068103512 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师2 天前
Maven dependency:tree 的 8 个高级用法
java·后端
cup112 天前
[技术复盘] Windows Python 打包实战:Nuitka 环境踩坑总结与 CI 自动化构建全指南
python·ai·环境变量·ci·nuitka·skill
aqi002 天前
15天学会AI应用开发(七)有了大模型为什么还要引入RAG
人工智能·python·大模型·ai编程·ai应用
行者全栈架构师2 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_02 天前
mac(m5)平台编译openjdk
java
金銀銅鐵2 天前
用 Python 实现 Take-Away 游戏
python·游戏