Який безпечний спосіб створити Temp-файл на Java?


96

Я шукаю безпечний спосіб створити тимчасовий файл на Java. Під безпекою я маю на увазі наступне:

  • Ім'я повинно бути унікальним, навіть за умови потенційних перегонів (наприклад, інший Потік одночасно викликає ту саму функцію, або інший процес запускає цей код одночасно)
  • Файл повинен бути приватним, навіть за умови потенційних перегонів (наприклад, інший користувач намагається chmod-файл із високою швидкістю)
  • Я можу сказати йому видалити файл, без необхідності виконувати загальне видалення та ризикувати видаленням неправильного файлу
  • В ідеалі слід переконатися, що файл видалено, навіть якщо виключення буде видалено до того, як я отримаю можливість
  • Файл за замовчуванням повинен мати розумне розташування (наприклад, вказаний JVM tmp dir, за замовчуванням системний тимчасовий dir)

3
Використовуйте File f = File.createTempFile(prefix, extension). Він буде розміщений у тимчасовій папці. І разом з f.deleteOnExit()ним буде автоматично видалено при виході.
BackSlash

3
Delete on Exit не видалить файл, якщо vm виходить із винятком.
Йоганнес

Відповіді:


130

Використовуйте File.createTempFile().

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

Створить файл у тимчасовій директорії, наприклад:

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


1
Просто FYI, вам не потрібно турбуватися про наявність унікального префіксу / суфікса, оскільки Java створить випадковий рядок чисел між ними.
Squeazer

4
Супер! Будь-яка проблема з нормальною роботою tempFile.delete()на додачу до deleteOnExit(оскільки я не хочу мати орди тимчасових файлів, які висять перед виходом)?
SRobertJames

3
Ні, ви можете зробити це в будь-якому випадку.
Стефан

1
@SRobertJames: Без проблем. Річ у тім, що створення темпфілів із передбачуваними іменами створює проблеми з безпекою. Як тільки вони створюються безпечним способом з належними дозволами, вони цього не роблять.
Markus W Mahlberg

1
Я б не вважав це безпечним, створений файл можна прочитати у всьому світі, і він знаходиться в каталозі tmp, який має тенденцію бути доступним для будь-якого користувача.
Пітер Гербер,

37

З Java 7 з'явився новий файловий API "NIO2", який містить нові методи створення темп файлів і каталогів. Побачити

напр

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

або

Path tempFile = Files.createTempFile("tempfiles", ".tmp");

1
Я віддаю перевагу NIO, для якого не потрібен префікс.
Franklin Yu

0
String tempfilePath = System.getProperty("java.io.tmpdir");
tempfilePath = tempfilePath.concat("filename.extension");

не вимагає префікса.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.