1. Обзор
Получить текущий рабочий каталог в Java несложно, но, к сожалению, в JDK нет прямого API для этого.
В этом руководстве мы узнаем, как получить текущий рабочий каталог в Java с помощью java.lang.
System
, java.io.File, java.nio.file.FileSystems
и java.nio.file.Paths
.
2. Система
Давайте начнем со стандартного решения, используя System#getProperty
, предполагая, что имя нашего текущего рабочего каталога — ForEach
во всем коде:
static final String CURRENT_DIR = "ForEach";
@Test
void whenUsingSystemProperties_thenReturnCurrentDirectory() {
String userDirectory = System.getProperty("user.dir");
assertTrue(userDirectory.endsWith(CURRENT_DIR));
}
Мы использовали встроенный в Java ключ свойства user.dir
для получения текущего рабочего каталога из карты свойств System .
Это решение работает во всех версиях 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. Пути
И, наконец, давайте рассмотрим более простое решение для получения текущего каталога с помощью API java.nio.file.Paths :
@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, поэтому его легко импортировать и запускать как есть.