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)

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


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,


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

nie wymaga przedrostka.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.