«1. Обзор

Создать каталог с помощью Java довольно просто. Язык предоставляет нам два метода, позволяющих создать либо один каталог, либо несколько вложенных каталогов — mkdir() и mkdirs().

В этом уроке мы увидим, как ведут себя они оба.

2. Создайте один каталог

Начнем с создания одного каталога.

Для наших целей мы будем использовать временный каталог пользователя. Мы можем найти его с помощью System.getProperty(“java.io.tmpdir”).

Мы передадим этот путь объекту Java File, который будет представлять наш временный каталог:

private static final File TEMP_DIRECTORY = new File(System.getProperty("java.io.tmpdir"));

Теперь давайте создадим внутри него новый каталог. Мы добьемся этого, вызвав метод File::mkdir для нового объекта File, представляющего каталог, который нужно создать:

File newDirectory = new File(TEMP_DIRECTORY, "new_directory");
assertFalse(newDirectory.exists());
assertTrue(newDirectory.mkdir());

Чтобы убедиться, что наш каталог еще не существует, мы сначала использовали метод exists().

Затем мы вызвали метод mkdir(), который сообщает нам, удалось ли создать каталог. Если бы каталог уже существовал, метод вернул бы false.

Если мы снова сделаем те же вызовы:

assertTrue(newDirectory.exists());
assertFalse(newDirectory.mkdir());

Тогда, как мы и ожидали, метод вернет false при втором вызове.

И метод mkdir() возвращает false не только тогда, когда каталог уже существует, но и в некоторых других ситуациях. Например, может существовать файл с именем каталога, который мы хотим создать. Или у нас может не хватить прав для создания этого каталога.

Имея это в виду, мы должны найти способ убедиться, что наш каталог в конце концов существует, либо мы его создали, либо он уже был там. Для этой цели мы могли бы использовать метод isDirectory():

newDirectory.mkdir() || newDirectory.isDirectory()

Таким образом, мы удостоверимся, что нужный нам каталог существует.

3. Создание нескольких вложенных каталогов

То, что мы видели до сих пор, хорошо работает в одном каталоге, но что произойдет, если мы захотим создать несколько вложенных каталогов?

В следующем примере мы увидим, что File::mkdir не работает для этого:

File newDirectory = new File(TEMP_DIRECTORY, "new_directory");
File nestedDirectory = new File(newDirectory, "nested_directory");
assertFalse(newDirectory.exists());
assertFalse(nestedDirectory.exists());
assertFalse(nestedDirectory.mkdir());

Поскольку new_directory не существует, mkdir не создает нижележащий вложенный_каталог.

Однако класс File предоставляет нам для этого другой метод — mkdirs(). Этот метод будет вести себя как mkdir(), но также создаст все несуществующие родительские каталоги.

В нашем предыдущем примере это означало бы создание не только вложенного_каталога, но и нового_каталога.

Обратите внимание, что до сих пор мы использовали конструктор File(File, String), но мы также можем использовать конструктор File(String) и передать полный путь к нашему файлу, используя File.separator для разделения различных частей пути:

File newDirectory = new File(System.getProperty("java.io.tmpdir") + File.separator + "new_directory");
File nestedDirectory = new File(newDirectory, "nested_directory");
assertFalse(newDirectory.exists());
assertFalse(nestedDirectory.exists());
assertTrue(nestedDirectories.mkdirs());

Как мы видим, каталоги созданы как положено. Более того, метод возвращает true только в том случае, если создан хотя бы один каталог. Что касается метода mkdir(), то в остальных случаях он вернет false.

Следовательно, это означает, что метод mkdirs(), используемый для каталога, родительские каталоги которого существуют, будет работать так же, как и метод mkdir().

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

В этой статье мы рассмотрели два метода, позволяющих создавать каталоги в Java. Первый, mkdir(), предназначен для создания одного каталога, если его родительские каталоги уже существуют. Второй, mkdirs(), может создать каталог, а также его несуществующие родители.

Код этой статьи можно найти на нашем GitHub.