在 Java IO 体系中,传统 java.io.File 类存在诸多痛点:API 老旧、功能单薄、异常不优雅、拼接繁琐、跨平台兼容性差、部分方法存在坑点。
Java 7 推出 NIO.2(java.nio.file) ,核心就是 Path + Paths + Files 全新文件体系,官方明确:新项目优先使用 Path,废弃 File 旧 API。
Path 是文件路径的现代化抽象,用于精准描述文件/目录路径,支持路径拼接、规范化、相对路径计算、符号链接解析、跨平台适配,搭配 Files 工具类可实现所有文件增删改查操作,功能全面碾压传统 File 类。
一、Path 核心概述
1.1 基本定义
Path 位于 java.nio.file 包,是 Java NIO.2 核心接口 ,用于表示文件系统的路径(文件路径 / 目录路径)。与 File 类似,Path 本身不读写文件内容 ,仅负责路径描述、路径运算、路径属性解析 ,文件读写、创建删除等操作交由工具类 Files 完成。
1.2 Path 对比 File 核心优势
- 不可变、线程安全:Path 对象创建后不可修改,多线程安全,可全局复用
- API 更丰富:支持路径拼接、相对路径、路径规范化、分段截取等高级操作
- 异常体系更优雅:精准抛出 IO 异常,避免 File 模糊返回 true/false
- 跨平台极强:自动适配 Windows / Linux / Mac 路径分隔符,无需手动拼接
- 功能解耦:Path 管路径,Files 管操作,职责单一清晰
二、Path 对象两种创建方式
Path 是接口,无法直接 new,必须通过静态工具方法获取实例,分为新旧两种写法。
2.1 Paths.get()|Java7 通用写法
JDK7 引入,经典通用写法,支持多参数分段拼接路径,自动处理分隔符。
ini
// 单参数路径
Path path = Paths.get("path/to/file.txt");
// 多参数拼接(推荐,跨平台零硬编码)
Path fullPath = Paths.get("D:", "test", "555.txt");
2.2 Path.of()|Java11+ 全新推荐写法
JDK11 优化 API,将静态方法下沉至 Path 接口本身,语义更简洁,官方推荐新项目使用。
ini
Path path = Path.of("D:\test\555.txt");
Path path2 = Path.of("test", "demo.txt");
最佳实践 :JDK11+ 一律使用
Path.of(),低版本兼容使用Paths.get()。
三、Path 核心方法详解
3.1 获取路径组成部分
快速拆解路径:文件名、父目录、根路径、路径层级。
csharp
public class PathPartDemo {
public static void main(String[] args) {
Path path = Path.of("D:\test\555.txt");
// 获取最后一级:文件名/目录名
System.out.println("文件名:" + path.getFileName()); // 555.txt
// 获取父目录路径
System.out.println("父目录:" + path.getParent()); // D:\test
// 获取磁盘根路径
System.out.println("根路径:" + path.getRoot()); // D:\
}
}
3.2 路径高级运算
1)resolve() 路径拼接(父子路径合并)
核心作用:当前父路径拼接子路径,自动补全分隔符,替代繁琐的字符串拼接。
scss
Path parent = Path.of("D:\test\");
Path child = Path.of("555.txt");
// 父子拼接
Path resolvePath = parent.resolve(child);
System.out.println(resolvePath); // D:\test\555.txt
2)normalize() 路径规范化(去除冗余)
核心作用 :自动清除路径中冗余的 .(当前目录)、..(上级目录),得到标准最简路径。
ini
Path path = Paths.get("D:\test\.\555.txt");
Path normalize = path.normalize();
System.out.println(normalize); // D:\test\555.txt
3)relativize() 计算相对路径
核心作用 :基于两个绝对路径,计算出相对路径,常用于文件引用、资源定位。
ini
Path base = Path.of("D:\test");
Path target = Path.of("D:\test\555.txt");
// 计算 target 相对于 base 的路径
Path relativePath = base.relativize(target);
System.out.println(relativePath); // 555.txt
3.3 路径类型转换
- toAbsolutePath() :将相对路径转为完整绝对路径,最常用
- toRealPath() :获取磁盘真实路径,自动解析符号链接、自动规范化,要求文件必须存在
ini
Path path = Path.of("test.txt");
System.out.println("绝对路径:" + path.toAbsolutePath());
// 真实路径(文件需存在)
// System.out.println(path.toRealPath());
3.4 路径属性判断
Path 自身仅提供路径类型判断,文件真实状态需配合 Files 工具类。
csharp
Path path = Path.of("D:\test\555.txt");
// 是否为绝对路径
System.out.println(path.isAbsolute());
// Files工具类判断真实文件状态
System.out.println(Files.isDirectory(path)); // 是否目录
System.out.println(Files.isRegularFile(path)); // 是否普通文件
3.5 Path 与 File 互转(新旧API兼容)
旧项目 File 快速迁移 NIO,只需一行转换,无缝兼容。
ini
// Path 转 File
Path path = Path.of("D:\test\555.txt");
File file = path.toFile();
// File 转 Path
Path newPath = file.toPath();
3.6 路径比较与判等
- equals() :判断两个路径字符串是否完全一致
- compareTo() :按字典顺序比较路径,可用于路径排序
ini
Path p1 = Path.of("D:\test\555.txt");
Path p2 = Path.of("D:\test\333.txt");
System.out.println(p1.equals(p2));
System.out.println(p1.compareTo(p2));
四、Files 工具类核心文件操作(Path 配套必用)
Path 只管路径,Files 才管操作,所有文件创建、删除、判断、复制移动均由 Files 静态方法实现。
4.1 常用实战 API
java
import java.nio.file.Files;
import java.nio.file.Path;
public class FilesDemo {
public static void main(String[] args) throws Exception {
Path path = Path.of("D:\test\555.txt");
// 1. 判断文件是否存在
boolean exists = Files.exists(path);
// 2. 创建空文件
Files.createFile(path);
// 3. 创建多级目录
Files.createDirectories(Path.of("D:\test\a\b\c"));
// 4. 删除文件/空目录
Files.delete(path);
}
}
五、Path 高频避坑指南
5.1 Path 对象不校验文件是否存在
new Path 只是路径映射 ,无论文件是否存在都不会报错,必须手动通过 Files.exists() 判断真实。
5.2 toRealPath() 文件必须存在
toRealPath() 会校验磁盘真实文件,文件不存在直接抛异常,不存在文件优先使用 toAbsolutePath()。
5.3 路径拼接禁止硬编码分隔符
不要手写 / 或 \,使用 Path.of(a,b,c) 或 resolve 自动适配跨平台。
5.4 relativize 必须同为绝对/同为相对路径
一个绝对路径、一个相对路径,调用 relativize 会直接报错。
六、File 与 Path 完整选型规范
| 特性 | File(IO 旧版) | Path(NIO 新版) |
|---|---|---|
| 线程安全 | 可变、非线程安全 | 不可变、线程安全 |
| 路径运算能力 | 弱,无拼接、相对路径方法 | 极强,支持 resolve、relativize、normalize |
| 异常机制 | 返回 true/false,异常模糊 | 精准抛 IO 异常,便于排查 |
| 跨平台 | 需手动处理分隔符 | 全自动适配 |
| 项目选型 | 老旧项目兼容 | 所有新项目首选 |
七、总结
- Path 是 NIO.2 路径接口,JDK7 推出,用于替代老旧 File 类,负责路径管理,不负责 IO 读写。
- 创建方式:JDK7 用
Paths.get(),JDK11+ 推荐 Path.of() 。 - resolve 拼接父子路径,relativize 计算相对路径,normalize 标准化最简路径。
- toAbsolutePath 获取绝对路径,toRealPath 获取真实物理路径(解析符号链接)。
- 文件真实状态、创建删除全部依赖 Files 工具类。
- Path 不可变线程安全,是生产环境文件操作最优方案。