什么是获取本地应用程序数据目录的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")
我更喜欢第一个选项
问候