7

几乎我读过的每一篇文章都告诉我,你不能在 Java 中拥有chdir 。这个问题的公认答案是你不能在 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
/家/地理/。
/媒体/。

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

4

3 回答 3

12

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

例如,尝试:

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

这最终会在哪里?在我的 Windows 机器上,即使new File(".").getAbsolutePath()基于 移动user.dirfoo.txt总是在原始工作目录中创建。令我震惊的是user.dirnew File(".") 引用当前工作目录的设置只是在自找麻烦。

于 2009-08-05T18:10:31.983 回答
7

引用:

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

讨论在这里

于 2009-08-05T18:18:14.700 回答
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 时进程的工作目录实际上并没有改变。

于 2009-08-05T18:21:56.330 回答