Java IO API实现获取路径信息并去除冗余信息

 更新时间:2026年03月19日 08:52:46   作者:Cache技术分享  
这篇文章主要为大家详细介绍了Java IO API实现获取路径信息并去除冗余信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

Java IO API - 获取路径信息

Path 可以被看作是存储路径名称元素的序列。路径结构中的第一个元素位于索引 0,而最后一个元素位于索引 [n-1],其中 n 是路径中元素的数量。Java 提供了多种方法来根据这些索引获取单独的元素或路径的子序列。

示例目录结构

我们使用以下目录结构作为示例:

  • Windows: C:\home\joe\foo
  • Solaris: /home/joe/foo

基本路径操作示例

下面的代码示例定义了一个 Path 实例,并调用了多个方法来获取路径的信息:

import java.nio.file.Path;
import java.nio.file.Paths;

public class PathInfoExample {
    public static void main(String[] args) {
        // 创建一个路径实例,Windows 路径格式
        Path pathWindows = Paths.get("C:\\home\\joe\\foo");
        
        // 创建一个路径实例,Solaris 路径格式
        Path pathSolaris = Paths.get("/home/joe/foo");
        
        // 打印路径的各种信息
        printPathInfo(pathWindows);
        printPathInfo(pathSolaris);
    }
    
    public static void printPathInfo(Path path) {
        System.out.format("toString: %s%n", path.toString());
        System.out.format("getFileName: %s%n", path.getFileName());
        System.out.format("getName(0): %s%n", path.getName(0));
        System.out.format("getNameCount: %d%n", path.getNameCount());
        System.out.format("subpath(0,2): %s%n", path.subpath(0, 2));
        System.out.format("getParent: %s%n", path.getParent());
        System.out.format("getRoot: %s%n", path.getRoot());
    }
}

方法与输出说明

以下是 Path 对象方法的详细解释和在不同操作系统下的返回值:

方法Solaris 返回值Windows 返回值说明
toString()/home/joe/fooC:\home\joe\foo返回路径的字符串表示。对于 UNIX 操作系统,会修正路径格式(例如 //home/joe/foo 会变为 /home/joe/foo)。
getFileName()foofoo返回路径的文件名(或路径中的最后一个元素)。
getName(0)homehome返回路径中指定索引位置的元素。此处为路径的第一个目录元素。
getNameCount()33返回路径中元素的数量。
subpath(0, 2)home/joehome\joe返回路径的子序列(不包含根元素),从索引 0 到索引 2(不包括索引 2)。
getParent()/home/joe\home\joe返回路径的父级目录。
getRoot()/C:\返回路径的根目录。

相对路径示例

下面是使用相对路径时的代码示例:

// Solaris 路径格式
Path pathSolarisRelative = Paths.get("sally/bar");

// Windows 路径格式
Path pathWindowsRelative = Paths.get("sally\\bar");

printPathInfo(pathSolarisRelative);
printPathInfo(pathWindowsRelative);

在 Solaris 和 Windows 中,输出结果如下:

方法Solaris 返回值Windows 返回值
toString()sally/barsally\bar
getFileName()barbar
getName(0)sallysally
getNameCount()22
subpath(0, 1)sallysally
getParent()sallysally
getRoot()nullnull

解释

  • toString(): 返回路径的字符串表示。当路径包含相对目录时,toString() 将显示相对路径,如 sally/bar 或 sally\bar。
  • getFileName(): 返回路径的最后一个部分(文件名或目录名),在上述示例中是 bar。
  • getName(0): 返回路径的第一个部分,这里是 sally。
  • getNameCount(): 返回路径中元素的数量,显示路径中有多少级目录或文件名。
  • subpath(0, 1): 返回从索引 0 到索引 1 之间的路径子序列。
  • getParent(): 返回路径的父级目录,对于相对路径,返回的是直接上级目录。
  • getRoot(): 对于相对路径,返回 null,因为相对路径没有根目录;对于绝对路径,返回根目录(如 / 或 C:\)。

Java IO API -去除路径中的冗余信息

在文件系统中,有一些特殊的路径标记:

  • "." 表示当前目录(current directory)
  • ".." 表示父目录(parent directory)

问题背景

你可能会遇到这样的路径:

/home/./joe/foo
/home/sally/../joe/foo

这些路径虽然可以正常使用,但存在冗余部分:

  • ./ 实际上什么都没改变
  • sally/.. 实际上回到了 sally 的上一级目录,也就是去掉了 sally

我们希望清理这些冗余路径,使其更简洁、语义清晰。为此,Java 提供了 normalize() 方法。

normalize() 方法:清理路径语法

normalize() 方法会纯粹基于字符串结构来移除路径中的冗余部分,例如:

  • "./" 会被移除
  • "xxx/.." 会被删除(包括 xxx..

注意:这个过程不会访问实际文件系统!它只是语法层面的路径清理。

示例代码:

import java.nio.file.Path;
import java.nio.file.Paths;

public class PathNormalizationExample {
    public static void main(String[] args) {
        Path path1 = Paths.get("/home/./joe/foo");
        Path path2 = Paths.get("/home/sally/../joe/foo");

        System.out.println("Original path1: " + path1);
        System.out.println("Normalized path1: " + path1.normalize());

        System.out.println("Original path2: " + path2);
        System.out.println("Normalized path2: " + path2.normalize());
    }
}

输出结果:

Original path1: /home/./joe/foo
Normalized path1: /home/joe/foo

Original path2: /home/sally/../joe/foo
Normalized path2: /home/joe/foo

注意事项:normalize() 是“语法清理”,不是“路径验证”

虽然 normalize() 非常有用,但它**不会考虑符号链接(symbolic links)**或文件系统中的真实结构。

比如:/home/sally -> /mnt/data/logs

如果你有路径 /home/sally/../joe/foo,直接 normalize() 会变成 /home/joe/foo。但这时候,sally 实际是个链接,删掉它可能指向了错误的路径!

更安全的方式:toRealPath()

如果希望在清理路径的同时确认文件或目录真实存在且正确解析符号链接,请使用 toRealPath() 方法。

Path path = Paths.get("/home/sally/../joe/foo");
Path realPath = path.toRealPath(); // 会解析链接,并检查文件存在性
  • 如果路径不存在或无法解析,会抛出异常
  • 会返回标准化、绝对的、符号链接已解析的路径

小结

方法功能说明是否访问文件系统
normalize()清除路径中的 "." 和 "../",只做语法层面简化❌ 否
toRealPath()返回真实存在的路径,解析符号链接并验证实际文件结构✅ 是

总结

通过 Path 类提供的各种方法,您可以轻松获取路径的各个部分,包括文件名、父目录、根目录以及路径元素的子序列。这些方法在处理路径时非常有用,尤其是在需要处理跨平台文件路径的场景下。

到此这篇关于Java IO API实现获取路径信息并去除冗余信息的文章就介绍到这了,更多相关Java获取路径信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot切面实现token权限校验详解

    SpringBoot切面实现token权限校验详解

    这篇文章主要介绍了SpringBoot切面实现token权限校验详解,要实现权限校验,首先数据表和实体类上需要有权限字段,我的表中permission和gender是通过外键约束permission表和gender表实现枚举的,因为可拓展性更好,需要的朋友可以参考下
    2024-01-01
  • springboot对接第三方微信授权及获取用户的头像和昵称等等

    springboot对接第三方微信授权及获取用户的头像和昵称等等

    这篇文章主要介绍了springboot对接第三方微信授权及获取用户的头像和昵称等等,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • JAVA中使用JSON进行数据传递示例

    JAVA中使用JSON进行数据传递示例

    本篇文章主要介绍了JAVA中使用JSON进行数据传递示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 全面解读Java NIO(看这篇就够了)

    全面解读Java NIO(看这篇就够了)

    Java NIO是Java1.4之后推出来的一套IO接口,NIO提供了一种完全不同的操作方式, NIO支持面向缓冲区的、基于通道的IO操作,这篇文章主要介绍了Java NIO详解(看这篇就够了),需要的朋友可以参考下
    2023-05-05
  • 一文盘点Java中常见内存泄漏场景与解决方法

    一文盘点Java中常见内存泄漏场景与解决方法

    内存泄漏 是指对象 已经不再被程序使用,但因为某些原因 无法被垃圾回收器回收,长期占用内存,最终可能引发 OOM,本文会介绍常见的几类内存泄漏场景,大家可以避免一下
    2025-12-12
  • SpringBoot配置web访问H2的方法

    SpringBoot配置web访问H2的方法

    这篇文章主要介绍了SpringBoot配置web访问H2的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • java同步与异步的学习笔记整理

    java同步与异步的学习笔记整理

    在本篇文章里小编给大家整理了关于java同步与异步的学习笔记整理内容,需要的朋友们参考下。
    2020-02-02
  • spring中@SpringBootTest注解的实现

    spring中@SpringBootTest注解的实现

    SpringBootTest是SpringBoot集成测试核心注解,通过加载完整应用上下文和配置,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • java获取用户输入的字符串方法

    java获取用户输入的字符串方法

    今天小编就为大家分享一篇java获取用户输入的字符串方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 利用Kotlin + Spring Boot实现后端开发

    利用Kotlin + Spring Boot实现后端开发

    这篇文章主要给大家介绍了关于利用Kotlin + Spring Boot实现后端开发的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11

最新评论