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

Java 获取本地应用程序数据目录路径的跨平台方式是什么?,java,cross-platform,Java,Cross Platform,我需要的是一种独立于平台的方式来获取本地应用程序数据目录的路径System.getenv(“LOCALAPPDATA”)似乎只适用于Windows。我该怎么做呢?你可以用这个 String currentDir = new File(".").getAbsolutePath(); 或者这个: System.getProperty("user.dir") 我喜欢第一种选择 对于适量的数据,考虑< > java > .UpL.Prf.Prase< >,或 javax .jnLP。两者都是跨平

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

你可以用这个

String currentDir = new File(".").getAbsolutePath();
或者这个:

System.getProperty("user.dir")
我喜欢第一种选择


对于适量的数据,考虑< <代码> > java > .UpL.Prf.Prase< <代码> >,或<代码> javax .jnLP。两者都是跨平台的。

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


注意,在这段代码中,我充分利用了Java在处理目录时对待
'/'
'\\'
相同的优势。Windows使用
'\\'
作为路径分隔符,但它也喜欢使用
'/'
。(至少Windows7是。)它对环境变量也不区分大小写;我们可以很容易地说
workingDirectory=System.getenv(“APPDATA”)C:\Users\\AppData\roaming\ Windows API函数)

两者之间的区别在于,本地配置文件是特定于用户和机器的,而漫游配置文件是特定于用户的,因此在像我的大学这样的设置中,漫游配置文件中的应用程序会上载到服务器,并同步到我登录的任何一台计算机


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

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

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

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

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

  • $XDG\u DATA\u HOME(本地)(默认为:$HOME/.local/share
  • $XDG\u CONFIG\u HOME(本地)(默认为:$HOME/.CONFIG
  • $XDG_DATA_DIRS(全局)(默认为:/usr/local/share//usr/share/
  • $XDG\u CONFIG\u DIRS(全局)(默认为:/etc/XDG
Windows XP:

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

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

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

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

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

Windows Vista+:

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

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

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

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

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

就我个人而言,我发现对于类似的用例非常有用。它可以定位不同类型的有用目录:

  • getUserDataDir
  • getUserConfigDir
  • getUserCacheDir
  • getUserLogDir
  • getSiteDataDir
    ← 看起来这就是你需要的
  • getSiteConfigDir
它返回的位置或多或少是标准的:

  • 在Unix上,它如下所示
  • 在它调用的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.