为什么user.dir系统属性使用Java?

我读过的几乎每篇文章都告诉我,你不能用Java创建chdir 。 这个问题的公认答案说你不能用Java做到这一点。

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

 geo @ codebox:〜$ java -version
 java版“1.6.0_14”
 Java(TM)SE运行时环境(版本1.6.0_14-b08)
 Java HotSpot(TM)客户端VM(内置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:〜$ pwd
 /家/地理
 geo @ codebox:〜$ java Ch
 /家庭/地理/。
 /媒体/。

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

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

例如,尝试:

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

那最终会在哪里? 在我的Windows框中,即使new File(".").getAbsolutePath()基于user.dir移动, foo.txt也始终在原始工作目录中创建。 设置user.dir使new File(".") 引用当前工作目录只是在寻找麻烦。

引用:

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

讨论在这里

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时,进程的工作目录实际上没有改变。

Interesting Posts