Quel est le moyen sûr de créer un fichier temporaire en Java?

96

Je recherche un moyen sûr de créer un fichier temporaire en Java. Par sûr, je veux dire ce qui suit:

  • Le nom doit être unique, même dans des conditions de concurrence potentielles (par exemple, un autre thread appelle la même fonction en même temps, ou un autre processus exécute ce code simultanément)
  • Le fichier doit être privé, même dans des conditions de concurrence potentielles (par exemple, un autre utilisateur essaie de chmod fichier à un débit élevé)
  • Je peux lui dire de supprimer le fichier, sans que je doive faire une suppression générique, et risquer de supprimer le mauvais fichier
  • Idéalement, je dois vous assurer que le fichier est supprimé, même si une exception est levée avant que j'aie la chance de
  • Le fichier doit être par défaut à un emplacement sain (par exemple, le répertoire tmp spécifié par la JVM, par défaut le répertoire temporaire du système)
SRobertJames
la source
3
Utilisez File f = File.createTempFile(prefix, extension). Il sera placé dans le répertoire temporaire. Et avec f.deleteOnExit()elle sera automatiquement supprimée à la sortie.
BackSlash
3
Supprimer à la sortie ne supprimera pas le fichier, si la VM se ferme avec une exception.
Johannes

Réponses:

130

Utilisez File.createTempFile().

File tempFile = File.createTempFile("prefix-", "-suffix");
//File tempFile = File.createTempFile("MyAppName-", ".tmp");
tempFile.deleteOnExit();

Créera un fichier dans le répertoire temporaire, comme:

préfixe-6340763779352094442-suffixe

Stefan
la source
1
Juste pour info, vous n'avez pas à vous soucier d'avoir un préfixe / suffixe unique, car Java créera une chaîne aléatoire de nombres entre les deux.
Squeazer
4
Super! Un problème pour faire un normal tempFile.delete()en plus du deleteOnExit(puisque je ne veux pas avoir des hordes de fichiers temporaires qui traînent avant de quitter)?
SRobertJames
3
Non, vous pouvez le faire de toute façon.
Stefan
1
@SRobertJames: Aucun problème. Le fait est que la création de fichiers temporaires avec des noms prévisibles pose des problèmes de sécurité. Une fois qu'ils sont créés de manière sûre avec les autorisations appropriées, ils ne le font pas.
Markus W Mahlberg
1
Je ne considérerais pas cela comme sûr, le fichier créé est lisible dans le monde entier et il réside dans le répertoire tmp qui a tendance à être accessible à tout utilisateur.
Peter Gerber
37

Depuis Java 7, il existe la nouvelle API de fichier "NIO2" qui contient de nouvelles méthodes pour créer des fichiers et des répertoires temnp. Voir

par exemple

Path tempDir = Files.createTempDirectory("tempfiles");

ou

Path tempFile = Files.createTempFile("tempfiles", ".tmp");
Tim Büthe
la source
1
Je préfère NIO, qui ne nécessite pas de préfixe.
Franklin Yu