1. 概述
在 Java 中获取当前工作目录是一个很常见的任务,但遗憾的是,JDK 并没有提供一个直接的 API 来完成这个操作。
本文将介绍使用 System
、File
、FileSystems
和 Paths
四种方式来获取当前工作目录的方法。适用于不同 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 版本灵活选择即可。