Почему системное свойство user.dir работает в Java?

Почти в каждой статье, которую я читал, говорилось, что в Java не может быть chdir. Принятый ответ на этот вопрос говорит, что вы не можете сделать это в Ява.

Тем не менее, вот некоторые из вещей, которые я пробовал:

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)

Вот тестовый класс, который я использую:

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

Пожалуйста, объясните, почему это сработало. Могу ли я использовать это с этого момента и ожидать, что он будет работать одинаково на всех платформах?


person Geo    schedule 05.08.2009    source источник


Ответы (3)


Тот факт, что new File(".") дает желаемый ответ, не означает, что он делает то, что вам нужно.

Например, попробуйте:

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

Где это заканчивается? В моем компьютере с Windows, несмотря на то, что new File(".").getAbsolutePath() перемещается на основе user.dir, foo.txt всегда создается в исходном рабочем каталоге. Мне кажется, что установка user.dir таким образом, что new File(".") не относится к текущему рабочему каталогу, просто напрашивается на неприятности.

person Jon Skeet    schedule 05.08.2009
comment
Я не проверял это :). Я остановился, когда увидел, что изменение свойства user.dir отражается классом File. - person Geo; 05.08.2009

Цитировать:

Свойство user.dir устанавливается при запуске виртуальной машины как рабочий каталог. Вы не должны изменять это свойство или устанавливать его в командной строке. Если вы это сделаете, вы увидите некоторое непоследовательное поведение, поскольку в реализации есть места, которые предполагают, что user.dir является рабочим каталогом и что он не изменяется в течение срока службы виртуальной машины.

Обсуждение находится здесь

person 01es    schedule 05.08.2009

File.getAbsoluteFile() просто просматривает системное свойство user.dir, которое является копией рабочего каталога процесса при запуске виртуальной машины.

Лучшим тестом может быть проверка того, что рабочий каталог процесса действительно меняется. То, как вы можете это сделать, зависит от платформы, но в 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.

person Laurence Gonsalves    schedule 05.08.2009