Temporäre Verzeichnisse in Java erstellen

1. Übersicht

Temporäre Verzeichnisse sind nützlich, wenn wir eine Reihe von Dateien erstellen müssen, die wir später verwerfen können. Wenn wir temporäre Verzeichnisse erstellen, können wir an das Betriebssystem delegieren, wo sie abgelegt werden sollen, oder uns selbst angeben, wo wir sie ablegen möchten.

In diesem kurzen Tutorial erfahren Sie, wie Sie temporäre Verzeichnisse in Java mit verschiedenen APIs und Ansätzen erstellen . Alle Beispiele in diesem Lernprogramm werden mit einfachem Java 7+, Guava und Apache Commons IO ausgeführt.

2. Delegieren Sie an das Betriebssystem

Einer der beliebtesten Ansätze zum Erstellen temporärer Verzeichnisse besteht darin, das Ziel an das zugrunde liegende Betriebssystem zu delegieren. Der Speicherort wird durch die Eigenschaft java.io.tmpdir angegeben , und jedes Betriebssystem verfügt über eine eigene Struktur und Bereinigungsroutinen.

In einfachem Java erstellen wir ein Verzeichnis, indem wir das Präfix angeben, das das Verzeichnis annehmen soll:

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

Mit Guava ist der Prozess ähnlich, aber wir können nicht angeben, wie wir unserem Verzeichnis ein Präfix voranstellen möchten:

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

Apache Commons IO bietet keine Möglichkeit, temporäre Verzeichnisse zu erstellen. Es bietet einen Wrapper, um das temporäre Verzeichnis des Betriebssystems abzurufen, und dann liegt es an uns, den Rest zu erledigen:

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

Um Namenskonflikte mit vorhandenen Verzeichnissen zu vermeiden, verwenden wir UUID.randomUUID () , um ein Verzeichnis mit einem zufälligen Namen zu erstellen.

3. Festlegen des Standorts

Manchmal müssen wir angeben, wo wir unser temporäres Verzeichnis erstellen möchten. Ein gutes Beispiel ist während eines Maven-Builds. Da wir bereits ein "temporäres" Build- Zielverzeichnis haben , können wir dieses Verzeichnis verwenden, um temporäre Verzeichnisse zu platzieren, die unser Build möglicherweise benötigt:

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

Sowohl in Guava als auch in Apache Commons IO fehlen Methoden zum Erstellen temporärer Verzeichnisse an bestimmten Speicherorten.

Es ist zu beachten, dass das Zielverzeichnis je nach Build-Konfiguration unterschiedlich sein kann . Eine Möglichkeit, es kugelsicher zu machen, besteht darin, den Speicherort des Zielverzeichnisses an die JVM zu übergeben, die den Test ausführt.

Da sich das Betriebssystem nicht um die Bereinigung kümmert, können wir File.deleteOnExit () verwenden :

tmpdir.toFile().deleteOnExit();

Auf diese Weise wird die Datei gelöscht, sobald die JVM beendet wird, jedoch nur, wenn die Beendigung ordnungsgemäß ist .

4. Verwenden verschiedener Dateiattribute

Wie bei jeder anderen Datei oder jedem anderen Verzeichnis können beim Erstellen eines temporären Verzeichnisses Dateiattribute angegeben werden. Wenn wir also ein temporäres Verzeichnis erstellen möchten, das nur von dem Benutzer gelesen werden kann, der es erstellt, können wir die Attribute angeben, mit denen dies erreicht wird:

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

Wie erwartet bieten Guava und Apache Commons IO keine Möglichkeit, die Attribute beim Erstellen temporärer Verzeichnisse anzugeben.

Es ist auch erwähnenswert, dass im vorherigen Beispiel davon ausgegangen wird, dass wir uns unter einem Posix-kompatiblen Dateisystem wie Unix oder macOS befinden.

Weitere Informationen zu Dateiattributen finden Sie in unserem Handbuch zu NIO2-Dateiattribut-APIs.

5. Schlussfolgerung

In diesem kurzen Tutorial haben wir untersucht, wie temporäre Verzeichnisse in einfachem Java 7+, Guava und Apache Commons IO erstellt werden. Wir haben gesehen, dass einfaches Java die flexibelste Möglichkeit ist, temporäre Verzeichnisse zu erstellen, da es eine größere Auswahl an Möglichkeiten bietet und gleichzeitig die Ausführlichkeit auf ein Minimum beschränkt.

Wie üblich ist der gesamte Quellcode für dieses Tutorial auf GitHub verfügbar.