359. Java IO API - 路径比较与处理

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() 一起使用,增强路径比较的健壮性
相关推荐
肖永威4 分钟前
python版微电网仿真工具的前端托管选型:从http.server到FastAPI StaticFiles
前端·python·http·fastapi
风骏时光牛马4 分钟前
AI插件开发与效能提效工具箱
前端
梦影_6 分钟前
MySQL进阶教程(二)—— 储存过程与触发器(下)
开发语言·数据库·后端·sql·mysql·oracle·数据库开发
IT_陈寒7 分钟前
为什么你应该学习Java?
前端·人工智能·后端
AINative软件工程10 分钟前
LLM 应用的 Read-Your-Writes 一致性工程实践:写完就读,模型却返回旧数据
后端
FfHUCisI25 分钟前
无锁 Reactor 网络模型与 gnet / evio 架构拆解
服务器·开发语言·后端·golang
weixin_4173968327 分钟前
监控画面卡顿与录像缺失:码率、NVR与存储容量的排查顺序
前端·网络·技术·酒店·综合布线·弱电
高频因子挖掘机30 分钟前
从第一行 Python 代码开始,个人量化项目应该先接入历史行情还是实时行情?
后端·github·api
高频因子挖掘机31 分钟前
个人开发者如何高效处理 A 股日 K 线数据?基于 QuantDash 的清洗思路与复权实战
后端·github·api
曹牧42 分钟前
Eclipse 工作空间(Workspace)的默认 JDK 配置
前端