«1. Обзор

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

В этом руководстве мы узнаем, как получить текущий рабочий каталог в Java с помощью java.lang.System, java.io.File, java.nio.file.FileSystems и java.nio.file.Paths.

2. Система

Начнем со стандартного решения, используя System#getProperty, предполагая, что имя нашего текущего рабочего каталога — Baeldung во всем коде:

static final String CURRENT_DIR = "Baeldung";
@Test
void whenUsingSystemProperties_thenReturnCurrentDirectory() {
    String userDirectory = System.getProperty("user.dir");
    assertTrue(userDirectory.endsWith(CURRENT_DIR));
}

Мы использовали встроенный ключ свойства Java. user.dir для получения текущего рабочего каталога из карты свойств системы. Это решение работает во всех версиях JDK.

3. Файл

Давайте рассмотрим другое решение с использованием java.io.File:

@Test
void whenUsingJavaIoFile_thenReturnCurrentDirectory() {
    String userDirectory = new File("").getAbsolutePath();
    assertTrue(userDirectory.endsWith(CURRENT_DIR));
}

Здесь File#getAbsolutePath внутренне использует System#getProperty для получения имени каталога, аналогично нашему первому решению. Это нестандартное решение для получения текущего рабочего каталога, и оно работает во всех версиях JDK.

4. Файловые системы

Другой допустимой альтернативой может быть использование нового API java.nio.file.FileSystems:

@Test
void whenUsingJavaNioFileSystems_thenReturnCurrentDirectory() {
    String userDirectory = FileSystems.getDefault()
        .getPath("")
        .toAbsolutePath()
        .toString();
    assertTrue(userDirectory.endsWith(CURRENT_DIR));
}

Это решение использует новый Java NIO API и работает только с JDK 7 или выше.

5. Пути

И, наконец, давайте рассмотрим более простое решение для получения текущего каталога с помощью java.nio.file.Paths API:

@Test
void whenUsingJavaNioPaths_thenReturnCurrentDirectory() {
    String userDirectory = Paths.get("")
        .toAbsolutePath()
        .toString();
    assertTrue(userDirectory.endsWith(CURRENT_DIR));
}

Здесь Paths#get внутренне использует FileSystem#getPath для выборки путь. Он использует новый Java NIO API, поэтому это решение работает только с JDK 7 или выше.

6. Заключение

В этом руководстве мы рассмотрели четыре различных способа получить текущий рабочий каталог в Java. Первые два решения работают со всеми версиями JDK, тогда как последние два работают только с JDK 7 или выше.

Мы рекомендуем использовать системное решение, поскольку оно эффективно и прямолинейно. Мы можем упростить его, заключив этот вызов API в статический служебный метод и получив к нему прямой доступ.

Исходный код этого руководства доступен на GitHub — это проект на основе Maven, поэтому его легко импортировать и запускать как есть.