Почему системное свойство user.dir работает в Java? - PullRequest
6 голосов
/ 05 августа 2009

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 05 августа 2009

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

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

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

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

6 голосов
/ 05 августа 2009

Цитата:

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

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

1 голос
/ 05 августа 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.

...