获取本地应用程序数据目录路径的跨平台方式是什么?

时间:2012-06-20 06:29:16

标签: java cross-platform

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

7 个答案:

答案 0 :(得分:32)

你可能会说(如果我错了,或者这是一个糟糕的方法,我会反驳)

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");,它也会起作用。

答案 1 :(得分:12)

就个人而言,我发现appdirs对类似的用例非常有帮助。 has functions找到不同类型的有用目录:

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

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

答案 2 :(得分:10)

任务已经过时,但我错过了一个列出环境变量的答案,而不是一些有趣的绝对路径。我对OSX一无所知。这篇文章只包含有关windows和linux的信息。

我没有足够的积分来扩展现有的答案,所以我必须写一个新答案。

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

Vars定义与此问题相关:

  • $ XDG_DATA_HOME local )(默认为: $ HOME / .local / share
  • $ XDG_CONFIG_HOME local )(默认为: $ HOME / .config
  • $ XDG_DATA_DIRS 全球)(默认为: / usr / local / share / / usr / share / < /强>)
  • $ XDG_CONFIG_DIRS 全球)(默认为: / etc / xdg

Windows 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只能将一个环境变量用于配置和文件。请使用这些而不是绝对路径。

答案 3 :(得分:9)

对于适量的数据,请考虑java.util.prefs.Preferences,提及herejavax.jnlp.PersistenceService,讨论here。两者都是跨平台的。

答案 4 :(得分: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不允许应用决定这一点。相反,有一个全局用户可配置的设置,用于确定您将获得的文件夹。

答案 5 :(得分:0)

问题在于其他操作系统甚至没有明确定义的“应用程序数据目录”概念。通常它只是用户主目录中的一个隐藏子目录,其常规名称可能是也可能不是应用程序名称。


机械蜗牛评论如此:

  

不正确。 Linux有一个(默认为〜/ .local),我相信OS X也可以。

首先,它不是~/.local。它是~/.local/share。 (或者至少它在我的Linux机器上)。

其次,这是一个新想法。它似乎来自“freedesktop.org”民众,通过XDG Base Directory Specification。在其他更广泛认可的规范中没有提到应该如何组织Linux / UNIX文件系统。请注意他们对此页面上的“标准”的评价:http://www.freedesktop.org/wiki/

最后,大多数Linux命令都没有实现这个想法。这是相当不科学的,但是看看我的Linux盒子上的隐藏目录,我可以看到至少40个不同应用程序的迹象,使用~/或自定义子目录。相比之下,~/.local/share中只有16个应用程序的迹象。

少于1/3 的应用程序实现的命名约定几乎不是一个“定义明确的概念”......当然也不会以一种允许找到任意的方式应用程序的数据目录以便携方式。

答案 6 :(得分:-2)

您可以使用此

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

或者这个:

System.getProperty("user.dir")

我更喜欢第一个选项

此致