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

我需要的是获取本地应用程序数据目录path的平台无关的方式。 System.getenv("LOCALAPPDATA")似乎只适用于Windows。 我如何去做这件事?

你也许可以说类似的话(如果我错了,或者如果这是一个坏的方法,就会反驳我)

 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,但它也很满意'/' 。 (至lessWindows 7是。)它的环境variables也是不区分大小写的; 我们可以轻松地说workingDirectory = System.getenv("APPDATA"); 而且它也会起作用。

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

任务是旧的,但我错过了一个答案列表环境variables,而不是一些有趣的绝对path。 我对OSX一无所知。 这篇文章只包含关于windows和linux的信息。

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

Linux:正如前面提到的那样,有一些像freedesktop.org这样的定义了linux发行版试图实现的标准。 还有一个子页面定义了环境variables和它们的默认值(如果它们没有设置,默认情况下它们是空的。应用程序必须匹配variablestp默认值)。 链接到该页面: freedesktop.org env vars

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

Windows XP:

  • %APPDATA% (默认为: C:\ Documents and Settings {用户名} \ 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 {用户名} \ AppData \ Roaming )(在链接工作站之间共享,用户本地,保存文件和configuration)
  • %LOCALAPPDATA% (默认为: C:\ Users {用户名} \ AppData \ Local )(用户本地。保存文件和configuration)
  • %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有两个环境variables,可能没有设置(一个用于configuration,一个用于文件)。 Windows只要我能告诉只有一个环境varconfiguration和文件在一起。 请使用这些而不是绝对path。

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

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

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

  • 在Unix上,它遵循XDG基本目录规范 。
  • 在Windows上它调用SHGetFolderPath 。
  • 在macOS上,它使用众所周知的硬编码path。

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


机械蜗牛评论如此:

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

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

其次,这是一个新的想法。 它似乎来源于“freedesktop.org”民间,通过XDG基地目录规范 。 关于如何组织Linux / UNIX文件系统的其他更广泛认可的规范中没有提及。 并注意他们在这个页面上对他们的“标准”所说的话: http : //www.freedesktop.org/wiki/

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

不到1/3的应用程序实现的命名约定几乎不是一个“明确定义的概念”……当然也不能以便携的方式find任意应用程序的数据目录。

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

请注意,您无法对这些path进行硬编码,因为在networking安装中,它们可能在其他位置。 您不应该依赖环境variables,因为它们可以由用户修改。 您的应用程序应调用Windows API的SHGetKnownFolderPath函数。

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

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

你可以使用这个

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

或这个:

 System.getProperty("user.dir") 

我更喜欢第一个选项

问候