更改AppData路径(系统属性)

时间:2013-04-15 15:35:59

标签: java appdata

我正在为Minecraft游戏开发一个启动器,我想要做的是为游戏设置APPDATA(windows)位置。该值并未真正更改,但已针对执行代码的程序进行了修改。例如,通过使用System.setProperty("user.home", dir);更改“主页”文件夹位置,在Mac OS X或Linux系统上实现此功能非常容易,但如何使用Windows上的APPDATA文件夹实现此目的?

使用批处理脚本可以修改此位置; APPDATA=%CD%\minecraft

程序/启动器使用swing进行编程,而不是基于控制台。

3 个答案:

答案 0 :(得分:2)

你可以试试这个

Runtime.getRuntime().exec("cmd /c SET APPDATA=%CD%\minecraft");

答案 1 :(得分:2)

您可以为您生成的任何子进程更改APPDATA。使用ProcessBuilder。虽然很难,但是可以为当前流程更改它(使用JNI)。请参阅此相关问题:Is it possible to set an environment variable at runtime from Java?

答案 2 :(得分:2)

  1. APPDATA是一个Windows环境变量
  2. 搜索过去的答案:“java set environment variable”:

    How to add an environment variable in Java?
    ProcessBuilder environment variable in java
    How do I set environment variables from Java?
    Is it possible to set an environment variable at runtime from Java?

  3. 尝试通过强力本机命令执行来更改当前进程的环境变量 Runtime.getRuntime().exec("...")将无法正常工作 ,因为它在单独的进程中执行命令 - 环境更改仅适用于该进程。此外,System.getEnv()使用缓存结果,因此当前的Java程序很可能看不到更改。

  4. 更具体地适合您:

    • 您的启动器是一个摆动应用
    • 你的游戏是一个摇摆应用,有一个框架来运行游戏
    • 假设这些是两个单独的应用,而您的启动器应用启动了一个运行游戏应用的新流程

    • 如果是这样的话:

      • 创建ProcessBuilder实例以启动游戏过程:

        String javaHome = System.getProperty("java.home");
        String javaBin = javaHome +
                File.separator + "bin" +
               File.separator + "java";
        String classpath = System.getProperty("java.class.path");
        
        ProcessBuilder builder = new ProcessBuilder(
                javaBin, "-cp", classpath, "com.example.MinecraftGame");
        
      • 为游戏设置环境变量:

        Map<String, String> env = pb.environment();
        env.put("APPDATA", "%CD%\minecraft");
        
      • 运行游戏:

        Process process = builder.start();
        process.waitFor();
        return process.exitValue();
        
    • 如果不是这样的话:

      • 也许它应该是,因为java可以控制它产生的新进程的环境变量。
      • 如果您必须将两个应用合并为一个并在启动器应用中运行游戏,则需要在启动之前为启动器应用设置环境。使用命令行或启动启动程序的批处理脚本。