在Java中查找用户主目录的最佳方法是什么?

难点在于解决方案应该是跨平台的;它应该可以在Windows 2000、XP、Vista、OS X、Linux和其他Unix变体上运行。我正在寻找一个代码片段,可以为所有平台完成这一点,以及一种检测平台的方法。

每个Java错误4787931,系统属性用户。home在Windows XP上不能正常工作,因此使用这个系统属性不是一个可接受的解决方案,因为它不是跨平台的。


当前回答

实际上在Java 8中正确的方法是使用:

System.getProperty("user.home");

bug JDK-6519127已经被修复,并且在发布说明的“JDK 8和JDK 7之间的不兼容性”部分指出:

业务范围:Core Libs / java.lang 剧情简介 用于确定Windows上用户主目录的步骤已更改为遵循Microsoft推荐的方法。这种变化 可能在旧版本的Windows或where registry上可见 将设置或环境变量设置到其他目录。自然 不相容的 行为RFE 6519127

尽管这个问题已经很老了,我还是把它留给以后的参考。

其他回答

我会使用bug报告中详细描述的算法System.getenv(String),然后退回到使用用户。如果没有任何环境变量指示有效的现有目录,则使用Dir属性。这应该是跨平台的。

我认为,在Windows下,你真正想要的是用户名义上的“文档”目录。

其他人已经回答了我之前的问题,但一个有用的程序打印出所有可用的属性是:

for (Map.Entry<?,?> e : System.getProperties().entrySet()) {
    System.out.println(String.format("%s = %s", e.getKey(), e.getValue())); 
}
System.getProperty("user.home");

参见JavaDoc。

实际上在Java 8中正确的方法是使用:

System.getProperty("user.home");

bug JDK-6519127已经被修复,并且在发布说明的“JDK 8和JDK 7之间的不兼容性”部分指出:

业务范围:Core Libs / java.lang 剧情简介 用于确定Windows上用户主目录的步骤已更改为遵循Microsoft推荐的方法。这种变化 可能在旧版本的Windows或where registry上可见 将设置或环境变量设置到其他目录。自然 不相容的 行为RFE 6519127

尽管这个问题已经很老了,我还是把它留给以后的参考。

替代方案是使用Apache CommonsIO FileUtils.getUserDirectory()而不是System.getProperty("user.home")。它将得到相同的结果,并且在指定系统属性时不会出现输入错误。

您的项目中很有可能已经有Apache CommonsIO库。如果你计划只用它来获取用户主目录,就不要引入它。