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() 控制循环,处理大文件
相关推荐
齐 飞2 分钟前
idea中git误操作撤回git reset --hard ‘HEAD@{1}‘
java·git·intellij-idea
你的保护色18 分钟前
多AS互联BGP4综合实验设计
java
某不知名網友38 分钟前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft
Wang's Blog1 小时前
Java 项目实战: 交友项目 - MongoDB 入门:体系结构和命令行操作
java·mongodb·交友
小溪学编程1 小时前
将 Bean 放入 Spring 容器中的方式有哪些?
java·后端·spring
java_nnnn1 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode
用户3721574261351 小时前
Java 读取、修改和清空 PDF 文档属性(元数据)
java
SL_staff1 小时前
从‘改一行代码等三天’到‘改完即生效’:实施工程师的逻辑引擎避坑手记
java·产品·全栈
qetfw1 小时前
Bash 字符串处理:参数展开、序列与脚本执行方式
linux·开发语言·chrome·bash
小羊没烦恼!1 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#