7 Stimmen

Warum funktioniert die Systemeigenschaft user.dir in Java?

In fast jedem Artikel, den ich gelesen habe, wurde mir gesagt, dass man keine chdir in Java. Die akzeptierte Antwort auf diese Frage sagt, dass man das in Java nicht machen kann.

Aber hier sind einige der Dinge, die ich ausprobiert habe:

geo@codebox:~$ 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, die 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());
    }
}

geo@codebox:~$ pwd
/home/geo
geo@codebox:~$ java Ch
/home/geo/.
/media/.

Bitte erklären Sie, warum das funktioniert hat. Kann ich dies von nun an verwenden und erwarten, dass es auf allen Plattformen auf die gleiche Weise funktioniert?

13voto

Jon Skeet Punkte 1325502

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

Versuchen Sie es zum Beispiel:

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

Wo soll das enden? Auf meinem Windows-Rechner, auch wenn new File(".").getAbsolutePath() bewegt sich auf der Grundlage von user.dir , foo.txt wird immer im ursprünglichen Arbeitsverzeichnis erstellt. Es fällt mir auf, dass die Einstellung user.dir tal que new File(".") nicht auf das aktuelle Arbeitsverzeichnis verweisen, ist das nur eine Frage der Zeit.

0 Stimmen

Das habe ich nicht getestet :). Ich habe aufgehört, als ich sah, dass die Änderung der Eigenschaft user.dir von der Klasse File reflektiert wird.

8voto

01es Punkte 5192

Zitat:

Die Eigenschaft user.dir wird beim Start der VM auf das Arbeitsverzeichnis gesetzt. Sie sollten diese Eigenschaft nicht ändern oder über die Befehlszeile festlegen. Wenn Sie dies tun, werden Sie ein inkonsistentes Verhalten feststellen, da es Stellen in der Implementierung gibt, die davon ausgehen, dass user.dir das Arbeitsverzeichnis ist und dass es sich während der Lebensdauer der VM nicht ändert.

Die Diskussion ist aquí

2voto

Laurence Gonsalves Punkte 131009

File.getAbsoluteFile() betrachtet lediglich die Systemeigenschaft user.dir, die eine Kopie des Arbeitsverzeichnisses des Prozesses beim Start der VM ist.

Ein besserer Test könnte darin bestehen, zu überprüfen, ob sich das Arbeitsverzeichnis des Prozesses tatsächlich ändert. Wie Sie dies tun können, variiert je nach Plattform, aber unter Linux können Sie etwas wie:

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

wobei "18037" die PID des fraglichen Prozesses ist. Wenn Sie dies tun, werden Sie feststellen, dass sich das Arbeitsverzeichnis des Prozesses nicht ändert, wenn Sie user.dir aktualisieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X