跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java 文件操作核心 API 与实战场景

介绍 Java 文件操作的核心 API,对比传统 IO 与 NIO.2 体系。涵盖基础创建删除、文本读写、目录遍历及大文件处理等实战场景,提供完整代码示例。同时总结编码指定、路径适配、资源关闭等常见错误避坑指南,帮助开发者高效处理文件 IO 任务。

机器人发布于 2026/3/22更新于 2026/6/2536 浏览

文件是 IO 流乃至多线程的基础,学好文件这一板块可以为我们后续进一步学习 IO 流和多线程打下坚实的基础。在 Java 开发中,文件操作是高频且基础的核心技能 —— 无论是读取配置文件、生成日志、导出报表,还是处理用户上传的文件,都离不开对文件的创建、读取、写入、删除等操作。本文将从「实用场景」出发,手把手教你掌握 Java 文件操作的核心方法,从传统 IO 到 NIO.2,兼顾基础与最佳实践,新手也能快速上手。

一、前置知识:Java 文件操作的核心 API

Java 提供了两套核心文件操作体系,我们先理清它们的定位,避免用错工具:

体系核心包 / 类特点适用场景
传统 IOjava.io.File、FileReader、FileWriter兼容性好,API 偏底层简单文件操作、兼容老项目
NIO.2java.nio.file(Paths、Files)Java 7 新增,API 简洁、功能强、效率高新项目优先使用,支持批量操作、文件属性管理

本文以NIO.2为主(推荐),同时补充传统 IO 的核心用法,满足不同场景需求。

二、实战:文件操作核心场景(附完整代码)

所有示例代码均可直接复制到 IDE 中运行,建议先创建测试目录 / 文件,跟着步骤实操。

场景 1:基础操作(创建、删除、判断文件 / 目录)

这是文件操作的「基本功」,比如创建配置文件、判断文件是否存在、删除临时文件等。

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class FileBasicOperations {
    public static void main(String[] args) {
        // ========== 1. 传统 IO(File 类) ==========
        // 定义文件路径:Windows 用\\(转义)或/,Linux/Mac 用/
        File file = new File("test.txt");
        try {
            // 创建文件(不存在则创建,存在则返回 false)
            if (file.createNewFile()) {
                System.out.println("文件创建成功:" + file.getAbsolutePath());
            } else {
                System.out.println("文件已存在");
            }
            // 核心判断:文件/目录类型
            System.out.println("是否是文件:" + file.isFile());
            System.out.println("是否是目录:" + file.isDirectory());
            // 创建目录:mkdir(单层)、mkdirs(多层,推荐)
            File dir = new File("testDir/subDir");
            if (dir.mkdirs()) {
                System.out.println("多层目录创建成功:" + dir.getAbsolutePath());
            }
            // 删除文件/目录(目录需为空才能删除)
            if (file.delete()) {
                System.out.println("文件删除成功");
            }
        } catch (Exception e) {
            e.printStackTrace(); // 捕获 IO 异常(权限不足、路径不存在等)
        }
        // ========== 2. NIO.2(推荐) ==========
        Path path = Paths.get("test_nio.txt");
        try {
            // 创建文件(先判断是否存在,避免重复创建)
            if (!Files.exists(path)) {
                Files.createFile(path);
                System.out.println("NIO 创建文件成功:" + path.toAbsolutePath());
            }
            // 创建多层目录(无需区分单层/多层)
            Path dirPath = Paths.get("testDirNio/subDir");
            if (!Files.exists(dirPath)) {
                Files.createDirectories(dirPath);
                System.out.println("NIO 创建目录成功");
            }
            // 删除文件/目录(支持非空目录?不,需手动遍历删除子文件)
            if (Files.exists(path)) {
                Files.delete(path);
                System.out.println("NIO 删除文件成功");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

关键说明:

  • 路径适配:推荐用 Paths.get("目录", "子目录", "文件.txt"),自动适配不同系统的分隔符;
  • 异常处理:文件操作必然涉及 IO 异常,必须捕获或声明抛出;
  • 目录删除:delete() 只能删除空目录,非空目录需先遍历删除子文件 / 子目录。
场景 2:文本文件读取(最常用)

读取配置文件、日志文件、用户上传的文本等,NIO.2 的 Files.readAllLines 是最优解。

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class FileReadExample {
    public static void main(String[] args) {
        String filePath = "read_test.txt";
        // 先创建该文件并写入测试内容
        // 方式 1:一次性读取所有行(推荐,简洁)
        try {
            // 指定 UTF-8 编码,避免中文乱码
            List<String> lines = Files.readAllLines(Paths.get(filePath), StandardCharsets.UTF_8);
            for (String line : lines) {
                System.out.println("读取到行:" + line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 方式 2:读取为字节数组(兼容文本/二进制文件)
        try {
            byte[] content = Files.readAllBytes(Paths.get(filePath));
            String contentStr = new String(content, StandardCharsets.UTF_8);
            System.out.println("完整内容:\n" + contentStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

关键说明:

  • 编码指定:必须显式指定 StandardCharsets.UTF_8,否则会使用系统默认编码,导致中文乱码;
  • 大文件注意:readAllLines/readAllBytes 适合小文件(几十 MB 内),大文件需用流逐行读取(下文补充)。
场景 3:文本文件写入(覆盖 / 追加)

生成日志、导出数据、写入配置等场景,核心是「覆盖写入」和「追加写入」。

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;

public class FileWriteExample {
    public static void main(String[] args) {
        String filePath = "write_test.txt";
        // 要写入的内容(按行存储)
        List<String> content = Arrays.asList("Java 文件操作", "作者:示例", "时间:2026");
        try {
            // 方式 1:覆盖写入(文件不存在则创建,存在则清空原有内容)
            Files.write(Paths.get(filePath), content, StandardCharsets.UTF_8);
            System.out.println("覆盖写入成功");
            // 方式 2:追加写入(保留原有内容,在末尾添加)
            List<String> appendContent = Arrays.asList("", "——追加的内容");
            // 空行分隔
            Files.write(
                Paths.get(filePath),
                appendContent,
                StandardCharsets.UTF_8,
                java.nio.file.StandardOpenOption.APPEND // 追加模式
            );
            System.out.println("追加写入成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
场景 4:遍历目录下的所有文件

比如批量处理某目录下的所有 Excel 文件、统计日志文件数量等,NIO.2 的 Files.walk 非常高效。

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class DirectoryTraverseExample {
    public static void main(String[] args) {
        String dirPath = "testDir"; // 目标目录
        // 遍历目录(包括子目录),筛选所有文件
        try (Stream<Path> walk = Files.walk(Paths.get(dirPath))) {
            walk.filter(Files::isRegularFile) // 只保留文件(排除目录)
                .filter(path -> path.toString().endsWith(".txt")) // 筛选 txt 文件
                .forEach(path -> System.out.println("符合条件的文件:" + path.toAbsolutePath()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
扩展:大文件读写(避免内存溢出)

如果文件大小超过 100MB,不能用 readAllLines 一次性读取,需用「流」逐行处理:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

public class BigFileOperation {
    public static void main(String[] args) {
        String srcPath = "big_file.txt"; // 大文件路径
        String destPath = "copy_big_file.txt"; // 复制后的文件
        // 逐行读取 + 逐行写入(内存占用极低)
        try (BufferedReader br = Files.newBufferedReader(Paths.get(srcPath), StandardCharsets.UTF_8);
             BufferedWriter bw = Files.newBufferedWriter(Paths.get(destPath), StandardCharsets.UTF_8)) {
            String line;
            while ((line = br.readLine()) != null) {
                // 可在此处处理每行内容(比如过滤、修改)
                bw.write(line);
                bw.newLine(); // 换行
            }
            System.out.println("大文件复制完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、避坑指南:新手常犯的错误

  1. 中文乱码:未指定编码,默认使用系统编码(Windows 是 GBK,Linux 是 UTF-8),解决:所有读写操作显式指定 StandardCharsets.UTF_8;
  2. 路径错误:硬编码 Windows 路径(如 C:\\test.txt),Linux 下运行报错,解决:用 Paths.get("C:", "test.txt") 适配系统;
  3. 资源未关闭:传统 IO 的 FileInputStream 未关闭导致文件被占用,解决:用 try-with-resources 语法(自动关闭资源);
  4. 权限问题:写入系统目录(如 C 盘根目录)报错,解决:选择有写入权限的目录(如项目根目录、用户目录)。

四、总结

  1. Java 文件操作优先使用 java.nio.file(NIO.2),API 简洁且效率高,核心类是 Paths(路径)和 Files(操作);
  2. 小文件用 readAllLines/write 一次性处理,大文件用 BufferedReader/BufferedWriter 逐行处理;
  3. 所有文件操作必须处理 IO 异常,显式指定 UTF-8 编码,避免乱码和兼容性问题。

掌握以上内容,你就能应对 90% 的 Java 文件操作场景。如果需要处理二进制文件(如图片、视频)、文件复制 / 移动、文件属性修改等进阶操作,可在评论区留言,后续会补充对应的示例。文章如有错误欢迎私信我,我会及时解决。

目录

  1. 一、前置知识:Java 文件操作的核心 API
  2. 二、实战:文件操作核心场景(附完整代码)
  3. 场景 1:基础操作(创建、删除、判断文件 / 目录)
  4. 场景 2:文本文件读取(最常用)
  5. 场景 3:文本文件写入(覆盖 / 追加)
  6. 场景 4:遍历目录下的所有文件
  7. 扩展:大文件读写(避免内存溢出)
  8. 三、避坑指南:新手常犯的错误
  9. 四、总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Linux 调试器 gdb 和 cgdb 使用指南
  • 基于 AI 的骑手健康证自动生成系统实现
  • MySQL 权限管理与 C/C++ 客户端对接实战指南
  • 本地 LLM 模型与 Ollama、Python 集成实战
  • 大语言模型 (LLM) 基础:原理、应用与挑战
  • Claude Code 模型参数配置详解
  • Ubuntu 系统下 Cursor 编辑器安装与配置指南
  • LeetCode 207. 课程表:BFS 与 DFS 拓扑排序解法
  • Lostlife2.0 角色对话系统升级:LLama-Factory 微调实战
  • 机器人未知测量噪声的扩展卡尔曼滤波同时定位与地图绘制
  • 无人机三维路径规划:A*, RRT 与 APF 算法对比及 MATLAB 实现
  • Spring Boot Redis 存储对象报 ClassCastException 问题排查与解决
  • llama.cpp 大模型部署指南:CPU/GPU 兼容与 Docker 快速启动
  • OpenClaw + MCP:构建支持任意工具的 AI 助手
  • 基于 Claude Code 与 Figma 的 AI 原型协作方案
  • Java外部内存API详解:核心概念、五大使用场景与最佳实践
  • PyAutoGUI:Python 桌面自动化框架详解
  • 二分查找算法实战:平方根与山脉数组
  • Docker Compose 重启策略详解:always、on-failure、no 与 unless-stopped 的区别
  • 复旦微 FMQL45T900 与 ZYNQ7045 对比测评:性能差异与迁移指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online