Как я могу изменить текущий рабочий каталог в программе Java? Все, что я смог найти об этой проблеме, утверждает, что вы просто не можете этого сделать, но я не могу поверить, что это действительно так.
У меня есть фрагмент кода, который открывает файл, используя жестко заданный относительный путь к файлу из каталога, в котором он обычно запускается, и я просто хочу иметь возможность использовать этот код из другой Java-программы без необходимости запускать его из определенного каталога. Кажется, что вы должны просто иметь возможность вызывать System.setProperty( "user.dir", "/path/to/dir" ), но, насколько я могу понять, вызов этой строки просто беззвучно завершается ошибкой и ничего не делает.
Я бы понял, если бы Java не позволяла вам этого делать, если бы не тот факт, что она позволяет вам получить текущий рабочий каталог, и даже позволяет открывать файлы, используя относительные пути к файлам....
Переведено автоматически
Ответ 1
Надежного способа сделать это в чистой Java не существует. Установка user.dir свойства через System.setProperty() или java -Duser.dir=..., похоже, влияет на последующие создания Files, но не, например, FileOutputStreams.
Конструктор File(String parent, String child) может помочь, если вы создадите путь к каталогу отдельно от пути к файлу, что упростит замену.
Альтернативой является настройка скрипта для запуска Java из другого каталога или использование собственного кода JNI, как предложено ниже.
Если вы запустите свою устаревшую программу с помощью ProcessBuilder, вы сможете указать ее рабочий каталог.
Ответ 3
Есть способ сделать это, используя системное свойство "user.dir". Ключевая часть, которую нужно понять, заключается в том, что необходимо вызвать getAbsoluteFile() (как показано ниже), иначе относительные пути будут разрешены в соответствии со значением "user.dir" по умолчанию по умолчанию.
import java.io.*;
publicclassFileUtils { publicstaticbooleansetCurrentDirectory(String directory_name) { booleanresult=false; // Boolean indicating whether directory was set File directory; // Desired current working directory
directory = newFile(directory_name).getAbsoluteFile(); if (directory.exists() || directory.mkdirs()) { result = (System.setProperty("user.dir", directory.getAbsolutePath()) != null); }
return result; }
publicstatic PrintWriter openOutputFile(String file_name) { PrintWriteroutput=null; // File to open for writing
Можно изменить PWD, используя JNA / JNI для выполнения вызовов libc. У ребят из JRuby есть удобная библиотека Java для выполнения вызовов POSIX под названием jnr-posix. Вот информация о maven