【问题标题】:Why is the user.dir system property working in Java?为什么 user.dir 系统属性在 Java 中工作?
【发布时间】:2010-11-17 02:44:22
【问题描述】:

几乎我读过的每篇文章都告诉我,Java 中不能有 chdir。对this question 的接受回答说你不能在 Java 中做到这一点。

但是,这里有一些我尝试过的东西:

geo@codebox:~$ java -version java版本“1.6.0_14” Java(TM) SE 运行时环境 (build 1.6.0_14-b08) Java HotSpot(TM) Client VM(build 14.0-b16,混合模式,共享)

这是我正在使用的一个测试类:

import java.io.*;

public class Ch {
    public static void main(String[] args) {
        System.out.println(new File(".").getAbsolutePath());
        System.setProperty("user.dir","/media");
        System.out.println(new File(".").getAbsolutePath());
    }
}
geo@codebox:~$ 密码 /家/地理 geo@codebox:~$ java Ch /家/地理/。 /媒体/。

请解释为什么这会奏效。我可以从现在开始使用它并期望它在所有平台上都以相同的方式工作吗?

【问题讨论】:

    标签: java filesystems chdir


    【解决方案1】:

    引用:

    user.dir 属性在 VM 启动时设置为工作目录。您不应更改此属性或在命令行上设置它。如果你这样做了,那么你会看到一些不一致的行为,因为在实现中假设 user.dir 是工作目录并且它在 VM 的生命周期内不会改变。

    讨论是here

    【讨论】:

      【解决方案2】:

      File.getAbsoluteFile() 只是查看 user.dir 系统属性,它是 VM 启动时进程工作目录的副本。

      更好的测试可能是检查进程的工作目录是否真的在改变。如何做到这一点因平台而异,但在 Linux 上,您可以这样做:

      $  ls -l /proc/18037/cwd
      lrwxrwxrwx 1 laurence laurence 0 2009-08-05 11:16 /proc/18037/cwd -> /home/laurence/
      

      其中“18037”是相关进程的 pid。如果你这样做,我相信你会发现当你更新 user.dir 时,进程的工作目录实际上并没有改变。

      【讨论】:

        【解决方案3】:

        仅仅因为new File(".") 给出了想要的答案并不意味着它正在做你想做的事情。

        例如,试试:

        new FileOutputStream("foo.txt").close();
        

        结果会怎样?在我的 Windows 机器上,即使 new File(".").getAbsolutePath() 基于 user.dir 移动,foo.txt 总是在原始工作目录中创建。让我感到震惊的是,将 user.dir 设置为 new File(".") 引用当前工作目录只是自找麻烦。

        【讨论】:

        • 我没有测试 :)。当我看到 File 类反映了更改 user.dir 属性时,我停了下来。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多