Java'da bir Temp dosyası oluşturmanın güvenli bir yolu nedir?


106

Java'da geçici dosya oluşturmanın güvenli bir yolunu arıyorum . Güvenli derken şunu kastediyorum:

  • Ad, potansiyel yarış koşullarında bile benzersiz olmalıdır (örneğin, başka bir İş Parçacığı aynı işlevi aynı anda çağırır veya başka bir süreç bu kodu aynı anda çalıştırır)
  • Dosya, potansiyel yarış koşullarında bile özel olmalıdır (örneğin, başka bir kullanıcı yüksek hızda chmod dosyası oluşturmaya çalışır)
  • Genel bir silme işlemi yapmama gerek kalmadan dosyayı silmesini ve yanlış dosyayı silme riskini almasını söyleyebilirim
  • İdeal olarak, ben şansım olmadan istisna atılsa bile dosyanın
  • Dosya varsayılan olarak mantıklı bir konumda olmalıdır (örneğin, JVM tarafından belirtilen tmp dizini, varsayılan olarak sistem temp dizinine ayarlanması)

3
Kullanın File f = File.createTempFile(prefix, extension). Temp dizinine yerleştirilecektir. Ve f.deleteOnExit()onunla çıkışta otomatik olarak silinecek.
BackSlash

3
Çıkışta Sil, vm bir istisna ile çıkarsa, dosyayı silmez.
Johannes

Yanıtlar:


140

Kullanın File.createTempFile().

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

Temp dizininde aşağıdaki gibi bir dosya oluşturur:

önek-6340763779352094442-sonek


1
Bilginize, benzersiz bir önek / son eke sahip olma konusunda endişelenmenize gerek yok, çünkü Java arada rastgele bir sayı dizisi oluşturacaktır.
Squeazer

4
Süper! tempFile.delete()'E ek olarak normal bir işlem yapmakta herhangi bir sorun var mı deleteOnExit(çünkü çıkıştan önce ortalıkta dolaşan geçici dosyalar ordularını istemiyorum)
SRobertJames

3
Hayır, her iki şekilde de yapabilirsin.
Stefan

1
@SRobertJames: Sorun yok. Mesele şu ki, öngörülebilir adlara sahip geçici dosyaların oluşturulması güvenlik sorunları doğurur. Uygun izinlerle güvenli bir şekilde oluşturulduktan sonra, yapmazlar.
Markus W Mahlberg

1
Bunun güvenli olduğunu düşünmüyorum, oluşturulan dosya herkes tarafından okunabilir ve herhangi bir kullanıcı tarafından erişilebilir olma eğiliminde olan tmp dizininde bulunur.
Peter Gerber


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

ön ek gerektirmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.