Рубрики
Без рубрики

Создание временных каталогов в Java

Узнайте, как создавать временные каталоги в Java.

Автор оригинала: Rui Vilao.

1. Обзор

Временные каталоги пригодятся, когда нам нужно создать набор файлов, которые мы позже сможем удалить. Когда мы создаем временные каталоги, мы можем делегировать операционной системе, куда их поместить, или указать сами, где мы хотим их разместить.

В этом коротком уроке мы узнаем как создавать временные каталоги в Java, используя различные API и подходы . Все примеры в этом уроке будут выполнены с использованием простых Java 7+, Guava и Apache Commons IO .

2. Делегирование полномочий Операционной системе

Одним из наиболее популярных подходов, используемых для создания временных каталогов, является делегирование назначения базовой операционной системе. Местоположение задается свойством java.io.tmpdir , и каждая операционная система имеет свою собственную структуру и процедуры очистки.

В простой Java мы создаем каталог, указав префикс, который мы хотим, чтобы каталог принимал:

String tmpdir = Files.createTempDirectory("tmpDirPrefix").toFile().getAbsolutePath();
String tmpDirsLocation = System.getProperty("java.io.tmpdir");
assertThat(tmpdir).startsWith(tmpDirsLocation);

При использовании Гуавы процесс аналогичен, но мы не можем указать, как мы хотим префиксировать наш каталог:

String tmpdir = Files.createTempDir().getAbsolutePath();
String tmpDirsLocation = System.getProperty("java.io.tmpdir");
assertThat(tmpdir).startsWith(tmpDirsLocation);

Apache Commons IO не предоставляет способа создания временных каталогов. Он предоставляет оболочку для получения временного каталога операционной системы, а затем мы должны сделать все остальное:

String tmpDirsLocation = System.getProperty("java.io.tmpdir");
Path path = Paths.get(FileUtils.getTempDirectory().getAbsolutePath(), UUID.randomUUID().toString());
String tmpdir = Files.createDirectories(path).toFile().getAbsolutePath();
assertThat(tmpdir).startsWith(tmpDirsLocation);

Чтобы избежать столкновения имен с существующими каталогами, мы используем UUID.randomUUID() для создания каталога со случайным именем.

3. Указание местоположения

Иногда нам нужно указать, где мы хотим создать наш временный каталог. Хороший пример-во время сборки Maven. Поскольку у нас уже есть “временный” каталог сборки target , мы можем использовать этот каталог для размещения временных каталогов, которые могут понадобиться нашей сборке:

Path tmpdir = Files.createTempDirectory(Paths.get("target"), "tmpDirPrefix");
assertThat(tmpdir.toFile().getPath()).startsWith("target");

Как в Guava, так и в Apache Commons IO отсутствуют методы создания временных каталогов в определенных местах.

Стоит отметить, что каталог target может отличаться в зависимости от конфигурации сборки . Один из способов сделать его пуленепробиваемым-передать целевое расположение каталога в JVM, выполняющую тест.

Поскольку операционная система не заботится об очистке, мы можем использовать File.deleteOnExit() :

tmpdir.toFile().deleteOnExit();

Таким образом, файл удаляется после завершения JVM, но только в том случае, если завершение является изящным .

4. Использование Различных Атрибутов Файлов

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

FileAttribute attrs = PosixFilePermissions.asFileAttribute(
  PosixFilePermissions.fromString("r--------"));
Path tmpdir = Files.createTempDirectory(Paths.get("target"), "tmpDirPrefix", attrs);
assertThat(tmpdir.toFile().getPath()).startsWith("target");
assertThat(tmpdir.toFile().canWrite()).isFalse();

Как и ожидалось, Guava и Apache Commons IO не предоставляют способа указания атрибутов при создании временных каталогов.

Также стоит отметить, что в предыдущем примере предполагается, что мы находимся под файловой системой, совместимой с Posix, такой как Unix или macOS.

Более подробную информацию об атрибутах файлов можно найти в нашем руководстве по API атрибутов файлов NIO2 .

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

В этом коротком уроке мы изучили, как создавать временные каталоги в Java 7+, Guava и Apache Commons IO. Мы увидели, что простая Java является наиболее гибким способом создания временных каталогов, поскольку она предлагает более широкий спектр возможностей, сводя к минимуму многословие.

Как обычно, весь исходный код этого учебника доступен на GitHub .