Apa cara yang aman untuk membuat file Temp di Java?

102

Saya mencari cara yang aman untuk membuat file temp di Java. Yang saya maksud dengan aman adalah sebagai berikut:

  • Nama harus unik, bahkan dalam kondisi balapan potensial (mis. Thread lain memanggil func yang sama pada waktu yang sama, atau proses lain menjalankan kode ini secara bersamaan)
  • File harus bersifat pribadi, bahkan dalam kondisi balapan potensial (mis. Pengguna lain mencoba mengubah file chmod dengan kecepatan tinggi)
  • Saya dapat memberitahukannya untuk menghapus file, tanpa saya harus melakukan penghapusan umum, dan berisiko menghapus file yang salah
  • Idealnya, harus memastikan file dihapus, bahkan jika pengecualian dilemparkan sebelum saya sempat
  • File harus default ke lokasi yang waras (misalnya direktori tmp yang ditentukan JVM, default ke direktori suhu sistem)
SRobertJames
sumber
3
Gunakan File f = File.createTempFile(prefix, extension). Ini akan ditempatkan di dir temp. Dan dengan f.deleteOnExit()itu akan secara otomatis dihapus saat keluar.
BackSlash
3
Hapus saat Keluar tidak akan menghapus file, jika vm keluar dengan pengecualian.
Johannes

Jawaban:

136

Gunakan File.createTempFile().

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

Akan membuat file di dir temp, seperti:

prefix-6340763779352094442-suffix

Stefan
sumber
1
Untuk diketahui, Anda tidak perlu khawatir memiliki awalan / akhiran yang unik, karena Java akan membuat String angka acak di antaranya.
Squeazer
4
Super! Ada masalah melakukan normal tempFile.delete()selain deleteOnExit(karena saya tidak ingin memiliki gerombolan file temp berkeliaran sebelum keluar)?
SRobertJames
3
Tidak, Anda bisa melakukannya dengan cara apa pun.
Stefan
1
@SRobertJames: Tidak ada masalah. Masalahnya adalah bahwa pembuatan file temporer dengan nama yang dapat diprediksi menimbulkan masalah keamanan. Begitu mereka dibuat dengan cara yang aman dengan izin yang tepat, mereka tidak melakukannya.
Markus W Mahlberg
1
Saya tidak akan menganggap ini aman, file yang dibuat dapat dibaca dunia dan berada di direktori tmp yang cenderung dapat diakses oleh pengguna mana pun.
Peter Gerber
38

Sejak Java 7 ada file API baru "NIO2" yang berisi metode baru untuk membuat file dan direktori temnp. Lihat

misalnya

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

atau

Path tempFile = Files.createTempFile("tempfiles", ".tmp");
Tim Büthe
sumber
1
Saya lebih suka NIO, yang tidak membutuhkan prefiks.
Franklin Yu
0
String tempfilePath = System.getProperty("java.io.tmpdir");
tempfilePath = tempfilePath.concat("filename.extension");

tidak membutuhkan awalan.

peri
sumber