Вопрос-ответ

Changing the current working directory in Java?

Изменение текущего рабочего каталога в Java?

Как я могу изменить текущий рабочий каталог в программе 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, как предложено ниже.

Соответствующая ошибка OpenJDK была закрыта в 2008 году как "не исправленная".

Ответ 2

Если вы запустите свою устаревшую программу с помощью ProcessBuilder, вы сможете указать ее рабочий каталог.

Ответ 3

Есть способ сделать это, используя системное свойство "user.dir". Ключевая часть, которую нужно понять, заключается в том, что необходимо вызвать getAbsoluteFile() (как показано ниже), иначе относительные пути будут разрешены в соответствии со значением "user.dir" по умолчанию по умолчанию.

import java.io.*;

public class FileUtils
{
public static boolean setCurrentDirectory(String directory_name)
{
boolean result = false; // Boolean indicating whether directory was set
File directory; // Desired current working directory

directory = new File(directory_name).getAbsoluteFile();
if (directory.exists() || directory.mkdirs())
{
result = (System.setProperty("user.dir", directory.getAbsolutePath()) != null);
}

return result;
}

public static PrintWriter openOutputFile(String file_name)
{
PrintWriter output = null; // File to open for writing

try
{
output = new PrintWriter(new File(file_name).getAbsoluteFile());
}
catch (Exception exception) {}

return output;
}

public static void main(String[] args) throws Exception
{
FileUtils.openOutputFile("DefaultDirectoryFile.txt");
FileUtils.setCurrentDirectory("NewCurrentDirectory");
FileUtils.openOutputFile("CurrentDirectoryFile.txt");
}
}
Ответ 4

Можно изменить PWD, используя JNA / JNI для выполнения вызовов libc. У ребят из JRuby есть удобная библиотека Java для выполнения вызовов POSIX под названием jnr-posix. Вот информация о maven

java