2009-08-05 40 views
6

幾乎我讀過的每篇文章都告訴我,你不能在Java中使用chdirthis question接受的答案表示你不能用Java來完成。爲什麼user.dir系統屬性在Java中工作?

然而,這裏有一些我試過的東西:

 
[email protected]:~$ java -version 
java version "1.6.0_14" 
Java(TM) SE Runtime Environment (build 1.6.0_14-b08) 
Java HotSpot(TM) Client VM (build 14.0-b16, mixed mode, sharing) 

下面是我使用的是測試類:

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()); 
    } 
} 
 
[email protected]:~$ pwd 
/home/geo 
[email protected]:~$ java Ch 
/home/geo/. 
/media/. 

請解釋爲什麼這個工作。我可以從現在開始使用它並期望它在所有平臺上以相同的方式工作嗎?

回答

10

只因爲new File(".")給出了所需的答案並不意味着它正在做你想做的。

例如,嘗試:

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

哪裏爲此嗎?在我的Windows機器上,即使new File(".").getAbsolutePath()基於user.dir移動,foo.txt總是在原始工作目錄中創建。這讓我覺得設置user.dir這樣new File(".")不是指的是當前工作目錄只是惹麻煩而已。

+0

我沒有測試:)。當我看到更改user.dir屬性由File類反映時,我停下來了。 – Geo 2009-08-05 18:16:50

+1

這就是如此......所以......所以...... ***錯誤***。 :-) – 2014-01-20 13:07:43

6

報價:

使用user.dir屬性設置爲虛擬機啓動時的工作目錄。您不應該更改此屬性或將其設置在命令行上。如果你這樣做,那麼你會看到一些不一致的行爲,因爲假設user.dir是工作目錄,並且在虛擬機的生命週期中它不會更改。

的討論here

1

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時,進程的工作目錄並沒有真正改變。

相關問題