2009-08-05 6 views
6

Fast jeder Artikel, den ich lese, sagte mir, dass Sie chdir in Java nicht haben können. Die angenommene Antwort auf this question sagt, dass Sie es in Java nicht tun können.Warum funktioniert die Systemeigenschaft user.dir in Java?

jedoch hier einige der Sachen, die ich versucht:

 
[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) 

Hier ist eine Testklasse Ich verwende:

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/. 

Bitte erklären, warum dies funktioniert. Kann ich das von jetzt an nutzen und erwarte, dass es auf allen Plattformen gleich funktioniert?

Antwort

10

Nur weil new File(".") die gewünschte Antwort gibt, bedeutet das nicht, dass es tut, was Sie wollen.

Zum Beispiel versuchen:

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

Wo geht das Ende nach oben? Auf meiner Windows-Box, obwohl new File(".").getAbsolutePath() basierend auf user.dir bewegt wird, wird foo.txt immer im ursprünglichen Arbeitsverzeichnis erstellt. Es scheint mir, dass die Einstellung user.dir so, dass new File(".")nicht bezieht sich auf das aktuelle Arbeitsverzeichnis ist nur für Ärger zu fragen.

+0

Ich habe das nicht getestet :). Ich habe gestoppt, als ich gesehen habe, dass sich die Eigenschaft user.dir in der Klasse File widerspiegelt. – Geo

+1

Das ist so ... so ... so ... *** falsch ***. :-) –

6

Zitat:

Die user.dir Eigenschaft wird bei VM Start gesetzt das Arbeitsverzeichnis zu sein. Sie sollten diese Eigenschaft nicht ändern oder sie in der Befehlszeile festlegen. Wenn Sie dies tun, werden Sie ein inkonsistentes Verhalten feststellen, da in der Implementierung davon ausgegangen wird, dass die Datei user.dir das Arbeitsverzeichnis ist und sich während der Lebensdauer der VM nicht ändert.

Die Diskussion ist here

1

File.getAbsoluteFile() sucht nur am user.dir Systemeigenschaft, die eine Kopie des Arbeitsverzeichnis bei VM Start des Prozesses ist.

Ein besserer Test könnte sein, zu überprüfen, ob sich das Arbeitsverzeichnis des Prozesses tatsächlich ändert. Wie können Sie diese je nach Plattform variiert, aber auf Linux Sie so etwas wie zu können:

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

wo „18037“ ist die pid des Prozesses in Frage. Wenn Sie dies tun, werden Sie feststellen, dass das Arbeitsverzeichnis des Prozesses sich nicht ändert, wenn Sie user.dir aktualisieren.

Verwandte Themen