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

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

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

geo @ codebox: ~ $ java -version
Java-версия "1.6.0_14"
Java(TM) SE Runtime Environment (сборка 1.6.0_14-b08)
Клиентская виртуальная машина Java HotSpot(TM) (сборка 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
/ Главная / гео /.
/средства массовой информации/.

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

3 ответа

Решение

Просто так new File(".") дает желаемый ответ не означает, что он делает то, что вы хотите.

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

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

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

Цитата:

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

Обсуждение здесь

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" - это пид рассматриваемого процесса. Если вы сделаете это, я думаю, вы обнаружите, что рабочий каталог процесса фактически не меняется при обновлении user.dir.

Другие вопросы по тегам