Автор оригинала: François Dupire.
1. Обзор
Создание каталога с помощью Java довольно просто. Язык предоставляет нам два метода, позволяющих создавать либо один каталог, либо несколько вложенных каталогов – mkdir() и mkdirs() .
В этом уроке мы увидим, как они оба ведут себя.
2. Создайте единый каталог
Давайте начнем с создания единого каталога.
Для наших целей мы будем использовать каталог user temp . Мы можем посмотреть его с помощью 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());
Чтобы убедиться, что наш каталог еще не существует, мы сначала использовали существует() метод.
Затем мы вызвали метод 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 () , но также создаст все несуществующие родительские каталоги.
В нашем предыдущем примере это означало бы создание не только nested_directory , но и new_directory.
Обратите внимание, что до сих пор мы использовали File(Файл, Строка) конструктор, но мы также можем использовать File(Строка) конструктор и передать полный путь к нашему файлу с помощью 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 .