57

我需要的是一种独立于平台的方式来获取本地应用程序数据目录的路径。System.getenv("LOCALAPPDATA")似乎只适用于 Windows。我该怎么做?

4

6 回答 6

43

你可能会说类似(如果我错了,或者如果这是一个不好的方法,请反驳我)

private String workingDirectory;
//here, we assign the name of the OS, according to Java, to a variable...
private String OS = (System.getProperty("os.name")).toUpperCase();
//to determine what the workingDirectory is.
//if it is some version of Windows
if (OS.contains("WIN"))
{
    //it is simply the location of the "AppData" folder
    workingDirectory = System.getenv("AppData");
}
//Otherwise, we assume Linux or Mac
else
{
    //in either case, we would start in the user's home directory
    workingDirectory = System.getProperty("user.home");
    //if we are on a Mac, we are not done, we look for "Application Support"
    workingDirectory += "/Library/Application Support";
}
//we are now free to set the workingDirectory to the subdirectory that is our 
//folder.

请注意,在这段代码中,我充分利用了 Java在处理目录时'/'的处理方式。'\\'Windows'\\'用作 pathSeparator,但它也对'/'. (至少 Windows 7 是。)它的环境变量也不区分大小写;我们可以很容易地说workingDirectory = System.getenv("APPDATA");,它也会同样有效。

于 2013-05-21T00:29:35.887 回答
24

就个人而言,我发现appdirs它对类似的用例非常有帮助。它具有定位不同类型的有用目录的功能:

  • getUserDataDir
  • getUserConfigDir
  • getUserCacheDir
  • getUserLogDir
  • getSiteDataDir← 看起来这是你需要的
  • getSiteConfigDir

它返回的位置或多或少是标准的:

于 2017-01-11T19:13:48.160 回答
13

任务很旧,但我缺少一个列出环境变量的答案,而不是一些有趣的绝对路径。我对OSX一无所知。这篇文章仅包含有关 windows 和 linux 的信息。

我没有足够的分数来扩展已经存在的答案,所以我必须写一个新的。

Linux: 如前所述,存在诸如 freedesktop.org 之类的东西,它正在定义 linux 发行版试图实现的标准。还有一个子页面定义环境变量及其默认值(如果未设置,则默认为空。应用程序必须将变量与默认值匹配)。链接到该页面:freedesktop.org env vars

与此问题相关的变量定义:

  • $XDG_DATA_HOME本地)(默认为:$HOME/.local/share
  • $XDG_CONFIG_HOME本地)(默认为:$HOME/.config
  • $XDG_DATA_DIRS (全局) (默认为:/usr/local/share//usr/share/ )
  • $XDG_CONFIG_DIRS全局)(默认为:/etc/xdg

视窗XP:

  • %APPDATA%(默认为:C:\Documents and Settings{username}\Application Data

  • %CommonProgramFiles%(默认为:C:\Program Files\Common Files)(共享程序文件)

  • %CommonProgramFiles(x86)%(默认为:C:\Program Files (x86)\Common Files)(仅限 64 位!)(共享程序文件)

  • %ProgramFiles%(默认为:%SystemDrive%\Program Files

  • %ProgramFiles(x86)%(默认为:%SystemDrive%\Program Files (x86)(仅限 64 位版本))(仅限 64 位!)

Windows Vista +:

  • %APPDATA%(默认为:C:\Users{username}\AppData\Roaming)(在链接的工作站之间共享。用户本地。保存文件和配置)
  • %LOCALAPPDATA%(默认为:C:\Users{username}\AppData\Local)(本地用户。保存文件和配置)
  • %CommonProgramFiles%(默认为:C:\Program Files\Common Files)(共享程序文件)
  • %CommonProgramFiles(x86)%(默认为:C:\Program Files (x86)\Common Files)(仅限 64 位!)(共享程序文件)

  • %ProgramFiles%(默认为:%SystemDrive%\Program Files)(安装后不会更改的静态数据)

  • %ProgramFiles(x86)%(默认为:%SystemDrive%\Program Files (x86)(仅限 64 位版本))(仅限 64 位!)(安装后不会更改的静态数据)

  • %ProgramData%(默认为:%SystemDrive%\ProgramData)(影响所有用户的可变数据)

简而言之: Linux 有两个可能未设置的环境变量(一个用于配置,一个用于文件)。据我所知,Windows 只有一个环境变量用于配置和文件。请使用这些而不是绝对路径。

于 2016-10-05T08:27:04.380 回答
9

对于中等数量的数据,请考虑此处java.util.prefs.Preferences提到的,或此处讨论的。两者都是跨平台的。javax.jnlp.PersistenceService

于 2012-06-20T06:46:13.577 回答
1

没有跨平台的方式,因为不同操作系统使用的概念太不同而无法“抽象”。我不熟悉 *nix 和 Mac 约定,但在 Windows 上没有“主文件夹”,应用程序必须指定是否要将内容存储在漫游配置文件C:\Users\<username>\AppData\Roaming\<application vendor>\<application name>\默认情况下)或本地配置文件C:\Users\<username>\AppData\Local\<application vendor>\<application name>\默认情况下)。

请注意,您不能对这些路径进行硬编码,因为在网络安装中它们可能位于其他位置。您也不应该依赖环境变量,因为它们可以由用户修改。您的应用程序应该调用 Windows API 的SHGetKnownFolderPath函数。

两者的区别在于本地配置文件是特定于用户和机器的,而漫游配置文件是特定于用户的,所以在像我大学这样的设置中,放入漫游配置文件中的东西应用程序被上传到服务器和同步到我登录的任何计算机。

应用程序有责任选择他们想要存储的设置是本地的还是漫游的。不幸的是,Java 不允许应用程序来决定这一点。相反,有一个全局的用户可配置设置来确定您将获得哪个文件夹。

于 2016-02-26T11:51:35.190 回答
-4

你可以用这个

String currentDir = new File(".").getAbsolutePath();

或这个:

System.getProperty("user.dir")

我更喜欢第一个选项

问候

于 2012-06-20T06:45:01.410 回答