Как безопасно создать временный файл на Java?

102

Я ищу безопасный способ создать временный файл на Java. Под безопасностью я имею в виду следующее:

  • Имя должно быть уникальным даже в условиях потенциальной гонки (например, другой поток одновременно вызывает ту же функцию или другой процесс одновременно запускает этот код)
  • Файл должен быть приватным, даже в условиях потенциальной гонки (например, другой пользователь пытается выполнить chmod файл с высокой скоростью)
  • Я могу сказать ему, чтобы он удалил файл без общего удаления, и рискую удалить не тот файл
  • В идеале следует убедиться, что файл удален, даже если возникнет исключение, прежде чем я получу возможность
  • Файл должен по умолчанию находиться в разумном месте (например, JVM, указанный в каталоге tmp, по умолчанию - в системном временном каталоге)
Соберт Джеймс
источник
3
Используйте File f = File.createTempFile(prefix, extension). Он будет помещен во временный каталог. И при f.deleteOnExit()выходе автоматически удаляется.
BackSlash
3
Удалить при выходе не удалит файл, если виртуальная машина завершит работу с исключением.
Йоханнес

Ответы:

136

Используйте File.createTempFile().

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

Создаст файл во временном каталоге, например:

префикс-6340763779352094442-суффикс

Стефан
источник
1
К вашему сведению, вам не нужно беспокоиться об уникальном префиксе / суффиксе, поскольку Java создаст случайную строку чисел между ними.
Squeazer
4
Супер! Любая проблема с нормальным выполнением tempFile.delete()в дополнение к deleteOnExit(так как я не хочу, чтобы орды временных файлов торчали перед выходом)?
SRobertJames
3
Нет, вы можете сделать это в любом случае.
Стефан
1
@SRobertJames: Нет проблем. Дело в том, что создание временных файлов с предсказуемыми именами создает проблемы с безопасностью. Как только они созданы безопасным способом с соответствующими разрешениями, они этого не сделают.
Markus W Mahlberg
1
Я бы не считал это безопасным, созданный файл доступен для чтения всем и находится в каталоге tmp, который имеет тенденцию быть доступным для любого пользователя.
Питер Гербер
38

Начиная с Java 7 появился новый файловый API "NIO2", который содержит новые методы для создания файлов и каталогов temnp. Увидеть

например

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

или

Path tempFile = Files.createTempFile("tempfiles", ".tmp");
Тим Бют
источник
1
Я предпочитаю NIO, для которой не нужен префикс.
Франклин Ю
0
String tempfilePath = System.getProperty("java.io.tmpdir");
tempfilePath = tempfilePath.concat("filename.extension");

не требует префикса.

фея
источник