Création de répertoires temporaires en Java

1. Vue d'ensemble

Les répertoires temporaires sont utiles lorsque nous devons créer un ensemble de fichiers que nous pouvons supprimer ultérieurement. Lorsque nous créons des répertoires temporaires, nous pouvons déléguer au système d'exploitation où les placer ou nous spécifier où nous voulons les placer.

Dans ce court didacticiel, nous allons apprendre à créer des répertoires temporaires en Java à l'aide de différentes API et approches . Tous les exemples de ce didacticiel seront exécutés en utilisant Java 7+, Guava et Apache Commons IO.

2. Déléguer au système d'exploitation

L'une des approches les plus courantes utilisées pour créer des répertoires temporaires consiste à déléguer la destination au système d'exploitation sous-jacent. L'emplacement est donné par la propriété java.io.tmpdir , et chaque système d'exploitation a sa propre structure et ses propres routines de nettoyage.

En Java brut, nous créons un répertoire en spécifiant le préfixe que nous voulons que le répertoire prenne:

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

En utilisant Guava, le processus est similaire, mais nous ne pouvons pas spécifier comment nous voulons préfixer notre répertoire:

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

Apache Commons IO ne permet pas de créer des répertoires temporaires. Il fournit un wrapper pour obtenir le répertoire temporaire du système d'exploitation, puis c'est à nous de faire le reste:

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

Afin d'éviter les conflits de noms avec les répertoires existants, nous utilisons UUID.randomUUID () pour créer un répertoire avec un nom aléatoire.

3. Spécification de l'emplacement

Parfois, nous devons spécifier où nous voulons créer notre répertoire temporaire. Un bon exemple est lors d'une construction Maven. Puisque nous avons déjà un répertoire cible de construction «temporaire» , nous pouvons utiliser ce répertoire pour placer les répertoires temporaires dont notre construction pourrait avoir besoin:

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

Guava et Apache Commons IO manquent de méthodes pour créer des répertoires temporaires à des emplacements spécifiques.

Il convient de noter que le répertoire cible peut être différent en fonction de la configuration de construction . Une façon de le rendre à l'épreuve des balles consiste à transmettre l'emplacement du répertoire cible à la JVM exécutant le test.

Comme le système d'exploitation ne s'occupe pas du nettoyage, nous pouvons utiliser File.deleteOnExit () :

tmpdir.toFile().deleteOnExit();

De cette façon, le fichier est supprimé une fois la JVM terminée, mais uniquement si la fin est gracieuse .

4. Utilisation de différents attributs de fichier

Comme tout autre fichier ou répertoire, il est possible de spécifier des attributs de fichier lors de la création d'un répertoire temporaire. Donc, si nous voulons créer un répertoire temporaire qui ne peut être lu que par l'utilisateur qui le crée, nous pouvons spécifier l'ensemble des attributs qui accompliront cela:

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

Comme prévu, Guava et Apache Commons IO ne permettent pas de spécifier les attributs lors de la création de répertoires temporaires.

Il est également intéressant de noter que l'exemple précédent suppose que nous sommes sous un système de fichiers compatible Posix tel qu'Unix ou macOS.

Pour plus d'informations sur les attributs de fichier, consultez notre Guide des API d'attributs de fichier NIO2.

5. Conclusion

Dans ce court didacticiel, nous avons exploré comment créer des répertoires temporaires dans Java 7+, Guava et Apache Commons IO. Nous avons vu que Java brut est le moyen le plus flexible de créer des répertoires temporaires car il offre un plus large éventail de possibilités tout en gardant la verbosité au minimum.

Comme d'habitude, tout le code source de ce tutoriel est disponible à l'adresse over sur GitHub.