1. 概述

在 Java 中获取当前工作目录是一个很常见的任务,但遗憾的是,JDK 并没有提供一个直接的 API 来完成这个操作。

本文将介绍使用 SystemFileFileSystemsPaths 四种方式来获取当前工作目录的方法。适用于不同 JDK 版本,包括传统方式和 NIO 新 API。

2. 使用 System 类

这是最标准且推荐的方式,适用于所有 JDK 版本。

static final String CURRENT_DIR = "Baeldung";
@Test
void whenUsingSystemProperties_thenReturnCurrentDirectory() {
    String userDirectory = System.getProperty("user.dir");
    assertTrue(userDirectory.endsWith(CURRENT_DIR));
}

我们通过 Java 内置的 user.dir 属性获取当前目录路径。这个属性是 JVM 启动时自动设置的,表示启动目录。

✅ 优点:简单、兼容性强
❌ 缺点:返回的是字符串,不便于后续路径操作

3. 使用 File 类

这是另一种经典方式,适用于所有 JDK 版本。

@Test
void whenUsingJavaIoFile_thenReturnCurrentDirectory() {
    String userDirectory = new File("").getAbsolutePath();
    assertTrue(userDirectory.endsWith(CURRENT_DIR));
}

通过创建一个空路径的 File 对象,然后调用 getAbsolutePath() 方法获取完整路径。底层依然是调用了 System.getProperty("user.dir")

⚠️ 注意:虽然简洁,但这种方式属于非标准用法,不推荐在新代码中使用。

4. 使用 FileSystems 类

这是基于 Java NIO 的 API,仅适用于 JDK 7 及以上版本。

@Test
void whenUsingJavaNioFileSystems_thenReturnCurrentDirectory() {
    String userDirectory = FileSystems.getDefault()
        .getPath("")
        .toAbsolutePath()
        .toString();
    assertTrue(userDirectory.endsWith(CURRENT_DIR));
}

使用 FileSystems.getDefault() 获取默认文件系统,再通过 getPath("") 获取当前目录路径。

✅ 优点:NIO 风格,更现代
❌ 缺点:仅适用于 JDK 7+

5. 使用 Paths 类

这是最简洁的 NIO 方式,适用于 JDK 7 及以上版本。

@Test
void whenUsingJavaNioPaths_thenReturnCurrentDirectory() {
    String userDirectory = Paths.get("")
        .toAbsolutePath()
        .toString();
    assertTrue(userDirectory.endsWith(CURRENT_DIR));
}

Paths.get("") 实际上调用了 FileSystem.getPath(),是获取当前路径的简单粗暴写法。

✅ 优点:代码简洁,语义清晰
❌ 缺点:依赖 NIO,不兼容旧版本 JDK

6. 总结

方法 JDK 版本兼容性 推荐程度 说明
System.getProperty("user.dir") 所有版本 ✅✅✅ 推荐作为首选方案
new File("").getAbsolutePath() 所有版本 非标准做法,不建议
FileSystems.getDefault().getPath("") JDK 7+ ✅✅ NIO 风格,适合现代项目
Paths.get("").toAbsolutePath() JDK 7+ ✅✅✅ 简洁推荐

推荐做法:优先使用 System.getProperty("user.dir"),可以封装成一个静态工具方法供全局调用:

public class PathUtils {
    public static String getCurrentDirectory() {
        return System.getProperty("user.dir");
    }
}

源码地址:GitHub - core-java-os(Maven 项目,可直接导入运行)

如需兼容性与简洁性兼顾,可结合 Paths.get("").toAbsolutePath() 在现代项目中使用。根据项目 JDK 版本灵活选择即可。


原始标题:Get the Current Working Directory in Java