如何在Java中获取本地应用程序数据文件夹?

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

我正在寻找一种方法来获取本地应用程序数据文件夹,这是一个特殊的Windows文件夹,在Java中的位置。 不幸的是,以下仅适用于英文版的Windows XP,默认设置为:

System.getProperty("user.home") + "\\Local Settings\\Application Data" 

我想在.NET中有这样的东西:

 System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) 

有没有办法做到这一点,而不必调用Windows Shell API的SHGetSpecialFolderLocation ?

从Windows 95开始,不推荐使用“Shell Folders”registry项。该registry项包含一个注释:“!不要使用此registry项。请改为使用SHGetFolderPath或SHGetKnownFolderPath。 在Vista系统中,除了警告提示之外,所有的键都丢失了,所以我必须找出这个难题。

这个相关的stackoverflow答案解决了这个问题在Windows上使用JNA,这是我目前使用的解决scheme。

 System.getenv("APPDATA") 

(“本地设置”文件夹似乎没有envvariables,但这会给你“应用程序数据”文件夹)

那么下面呢

 String dataFolder = System.getenv("LOCALAPPDATA"); 

我有一个情况,这不是在“user.home”

我想用以下两种方法:

 String dataFolder = System.getenv("APPDATA"); String dataFolder = System.getProperty("user.home") + "\\Local Settings\\ApplicationData"; 

您可以从registry读取path: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\*其中*是其中一个键:

  • 本地应用程序数据( C:\Documents and Settings\USER\Local Settings\Application Data
  • 本地设置( C:\Documents and Settings\USER\Local Settings
  • AppData( C:\Documents and Settings\USER\Application Data

注意:这些示例path来自英文Windows XP安装

我以这种方式解决了

 private static File getAppData(){ ProcessBuilder builder = new ProcessBuilder(new String[]{"cmd", "/C echo %APPDATA%"}); BufferedReader br = null; try { Process start = builder.start(); br = new BufferedReader(new InputStreamReader(start.getInputStream())); String path = br.readLine(); // TODO HACK do not know why but I get an extra '"' at the end if(path.endsWith("\"")){ path = path.substring(0, path.length()-1); } return new File(path.trim()); } catch (IOException ex) { Logger.getLogger(Util.class.getName()).log(Level.SEVERE, "Cannot get Application Data Folder", ex); } finally { if(br != null){ try { br.close(); } catch (IOException ex) { Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex); } } } return null; } 

有可能产生一个进程来查询键,然后parsing输出:

 REG QUERY "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Local AppData" 

老实说,我更倾向于使用JNA或JNI。