【问题标题】:How to get local application data folder in Java? [duplicate]如何在 Java 中获取本地应用程序数据文件夹? [复制]
【发布时间】:2010-11-14 23:54:14
【问题描述】:

可能重复:
What is the cross-platform way of obtaining the path to the local application data directory?

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

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

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

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

有没有无需调用 Windows Shell API 的SHGetSpecialFolderLocation 的方法?

【问题讨论】:

  • 你需要它做什么?有更多 Java-y 方式来存储持久性信息,例如 Preferences API 或使用临时文件机制(可能结合使用:)
  • 我的应用程序需要从存储在这个特殊文件夹中的另一个应用程序(我无法移动)读取配置数据。
  • 啊,那你为什么要这个就更清楚了。
  • 同一个问题但跨平台:stackoverflow.com/questions/11113974/…

标签: java windows shell


【解决方案1】:

接下来呢

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

我有一种情况,它不在“user.home”下

【讨论】:

    【解决方案2】:

    从 Windows 95 开始,不推荐读取“Shell Folders”注册表项。注册表项包含一条注释“!请勿使用此注册表项。请改用 SHGetFolderPath 或 SHGetKnownFolderPath。”我不得不在 Vista 系统上找出这个问题,除了警告说明外,所有的键都丢失了。

    This related stackoverflow answer 在 Windows 上使用 JNA 解决了这个问题,这是我目前正在使用的解决方案。

    【讨论】:

    【解决方案3】:

    我想使用以下两种方式:

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

    【讨论】:

      【解决方案4】:

      我是这样解决的

      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;
      }
      

      【讨论】:

      • 不知道为什么这被否决了这么多,这对我来说似乎足够可靠。有点……过分,但很扎实。
      • 可能是因为System.getenv("APPDATA")应该是一样的吧?
      【解决方案5】:

      您可以从注册表中读取路径: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)

      注意:这些示例路径来自英文版 Windows XP 安装

      【讨论】:

      【解决方案6】:

      可能会产生一个进程来查询密钥然后解析输出:

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

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

      【讨论】:

      • 我也觉得可以调用Windows的原生函数,应该是近期不会改变的。
      【解决方案7】:
      System.getenv("APPDATA")
      

      (“本地设置”文件夹似乎没有环境变量,但这将为您提供“应用程序数据”文件夹)

      【讨论】:

      • 只知道APPDATA环境变量是一个windows only的构造,但有问题的应用程序是java,所以表面上应该是跨平台的。
      • 提问者要求的是“一个特殊的 Windows 文件夹”。所以我不相信这需要跨平台
      • 不需要跨平台。我只是在寻找一种方法来为当前用户获取这个特殊 Windows 文件夹的位置。
      • 刚刚检查过,很遗憾,LOCALAPPDATA 在 Windows XP 中不可用。
      • 请注意,APPDATA 环境变量在通过“运行方式...”启动的应用程序中不可用
      猜你喜欢
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 2013-04-22
      • 2012-03-28
      • 1970-01-01
      相关资源
      最近更新 更多