359. Java IO API - 路径比较与处理
Java 的 Path 接口(java.nio.file.Path)为路径之间的比较和处理提供了丰富的操作方法,包括:
equals()✅ 判断路径是否相等startsWith()和endsWith()🚪 检查路径前缀和后缀compareTo()🧮 排序用的比较方法iterator()🔁 遍历路径中的每一部分Files.isSameFile()📎 判断是否指向同一物理文件
✅ 1. 判断路径是否相等 --- equals()
java
Path path1 = Paths.get("/home/user/docs");
Path path2 = Paths.get("/home/user/docs");
if (path1.equals(path2)) {
System.out.println("路径完全相同!");
}
📌 equals() 判断路径的结构是否相同,而不涉及文件是否真的存在或是否是同一个物理文件。
🚪 2. 判断路径是否以某部分开始或结束 --- startsWith() / endsWith()
java
Path path = Paths.get("/home/user/docs/foo.txt");
System.out.println(path.startsWith("/home")); // true
System.out.println(path.endsWith("foo.txt")); // true
System.out.println(path.endsWith("docs/foo.txt")); // true
📌 startsWith() 和 endsWith() 可以接收字符串或 Path 类型的参数。适用于路径过滤、模式匹配等场景。
🔁 3. 遍历路径的每一层目录 --- iterator()
Path 实现了 Iterable<Path> 接口,可以直接使用增强 for 循环逐层访问路径:
java
Path path = Paths.get("/home/user/docs/foo.txt");
for (Path name : path) {
System.out.println(name);
}
📤 输出示例:
java
home
user
docs
foo.txt
📌 注意:根路径(例如 /)不会作为遍历元素返回。
🧮 4. 路径排序 --- compareTo()
java
List<Path> paths = List.of(
Paths.get("c.txt"),
Paths.get("a.txt"),
Paths.get("b.txt")
);
List<Path> sorted = new ArrayList<>(paths);
Collections.sort(sorted);
sorted.forEach(System.out::println);
📤 输出:
java
a.txt
b.txt
c.txt
📌 Path 实现了 Comparable<Path>,排序规则基于路径字符串的字典顺序(lexicographic order)。
📎 5. 判断两个路径是否指向同一个实际文件 --- Files.isSameFile()
java
Path p1 = Paths.get("/home/user/docs/foo.txt");
Path p2 = Paths.get("/home/user/docs/../docs/foo.txt");
try {
if (Files.isSameFile(p1, p2)) {
System.out.println("两个路径指向同一个实际文件!");
}
} catch (IOException e) {
e.printStackTrace();
}
📌 与 equals() 不同,Files.isSameFile() 会访问文件系统,解析符号链接和相对路径,确保两个路径最终引用的文件是同一个。
🧾 总结对比
| 方法 | 说明 | 是否访问文件系统 |
|---|---|---|
equals() |
结构性路径相等 | ❌ 否 |
startsWith() |
是否以指定路径开始 | ❌ 否 |
endsWith() |
是否以指定路径结束 | ❌ 否 |
compareTo() |
路径排序 | ❌ 否 |
Files.isSameFile() |
判断是否指向同一个文件(考虑符号链接等) | ✅ 是 |
iterator() |
遍历路径每一部分 | ❌ 否 |
💡 实际应用场景小贴士
- ✅ 用
startsWith()来实现"只处理某目录下的文件" - 📦 用
iterator()来构造相对路径或用于日志打印 - 🔒 用
isSameFile()避免重复处理同一个文件(即使路径不同) - 🧹 和
normalize()一起使用,增强路径比较的健壮性