Jaki jest bezpieczny sposób tworzenia pliku Temp w Javie?

101

Szukam bezpiecznego sposobu na utworzenie pliku tymczasowego w Javie. Przez bezpieczne rozumiem:

  • Nazwa powinna być unikalna, nawet w potencjalnych warunkach wyścigu (np. Inny wątek wywołuje tę samą funkcję w tym samym czasie lub inny proces uruchamia ten kod jednocześnie)
  • Plik powinien być prywatny, nawet w przypadku potencjalnych warunków wyścigu (np. Inny użytkownik próbuje chmod plik z dużą szybkością)
  • Mogę powiedzieć mu, żeby usunął plik, bez konieczności usuwania ogólnego i ryzykuję usunięcie niewłaściwego pliku
  • Najlepiej byłoby upewnić się, że plik został usunięty, nawet jeśli wyjątek zostanie zgłoszony, zanim będę miał okazję
  • Plik powinien domyślnie znajdować się w rozsądnej lokalizacji (np. Katalog tmp określony przez maszynę wirtualną JVM, domyślnie katalog tymczasowy systemu)
SRobertJames
źródło
3
Użyj File f = File.createTempFile(prefix, extension). Zostanie umieszczony w katalogu temp. A wraz z f.deleteOnExit()nim zostanie automatycznie usunięty przy wyjściu.
BackSlash
3
Usuń przy wyjściu nie usunie pliku, jeśli maszyna wirtualna zakończy działanie z wyjątkiem.
Johannes

Odpowiedzi:

135

Użyj File.createTempFile().

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

Utworzy plik w katalogu tymczasowym, na przykład:

prefix-6340763779352094442-suffix

Stefan
źródło
1
Po prostu do Twojej wiadomości, nie musisz się martwić o unikalny prefiks / sufiks, ponieważ Java utworzy losowy ciąg liczb pomiędzy.
Squeazer
4
Wspaniały! Czy jest jakiś problem z wykonywaniem normalnego tempFile.delete()oprócz deleteOnExit(ponieważ nie chcę mieć hord plików tymczasowych kręcących się przed wyjściem)?
SRobertJames
3
Nie, możesz to zrobić tak czy inaczej.
Stefan
1
@SRobertJames: Żadnych problemów. Chodzi o to, że tworzenie plików tymczasowych o przewidywalnych nazwach powoduje problemy z bezpieczeństwem. Gdy zostaną utworzone w bezpieczny sposób z odpowiednimi uprawnieniami, tego nie robią.
Markus W Mahlberg
1
Nie uważałbym tego za bezpieczne, utworzony plik jest czytelny dla wszystkich i znajduje się w katalogu tmp, który jest zwykle dostępny dla każdego użytkownika.
Peter Gerber,
38

Od wersji Java 7 istnieje nowe API plików „NIO2”, które zawiera nowe metody tworzenia plików i katalogów temnp. Widzieć

na przykład

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

lub

Path tempFile = Files.createTempFile("tempfiles", ".tmp");
Tim Büthe
źródło
1
Wolę NIO, które nie wymaga przedrostka.
Franklin Yu
0
String tempfilePath = System.getProperty("java.io.tmpdir");
tempfilePath = tempfilePath.concat("filename.extension");

nie wymaga przedrostka.

fairyjee
źródło