Създаване на временни директории в Java

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);

Използвайки Guava, процесът е подобен, но не можем да посочим как искаме да добавим префикса на нашата директория:

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. Тъй като вече имаме „временна“ целева директория за компилация , можем да се възползваме от нея, за да поставим временни директории, от които може да се нуждае нашата компилация:

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

Както в Guava, така и в Apache Commons IO липсват методи за създаване на временни директории на определени места.

Струва си да се отбележи, че целевата директория може да бъде различна в зависимост от конфигурацията на компилация . Един от начините да го направите устойчив на куршуми е да предадете местоположението на целевата директория на 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 File Attribute API.

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

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

Както обикновено, целият изходен код за този урок е достъпен в GitHub.