Misalkan saya membuat file sementara di Java dengan metode
File tmp = File.createTempFile(prefix, suffix);
Jika saya tidak secara eksplisit memanggil delete()
metode ini, kapan file tersebut akan dihapus?
Sebagai intuisi, itu mungkin terjadi ketika JVM berakhir, atau lebih awal (oleh Pengumpul Sampah), atau lebih baru (oleh beberapa proses pembersihan Sistem Operasi).
java
garbage-collection
temporary-files
Alphaaa
sumber
sumber
Jawaban:
File tidak akan dihapus secara otomatis, dari JavaDoc :
Jadi, Anda harus memanggil deleteOnExit () secara eksplisit :
sumber
Sebagai jawaban yang lain mencatat, file-file sementara yang dibuat dengan
File.createTempFile()
akan tidak dihapus secara otomatis kecuali Anda secara eksplisit memintanya.Generik, cara yang portabel untuk melakukan ini adalah untuk memanggil
.deleteOnExit()
padaFile
objek, yang akan menjadwalkan file untuk penghapusan ketika JVM berakhir. Sedikit kerugian dari metode ini, bagaimanapun, adalah metode ini hanya berfungsi jika VM berhenti secara normal; pada penghentian abnormal (mis. VM crash atau penghentian paksa proses VM), file mungkin tetap tidak dihapus.Pada sistem Unixish (seperti Linux), sebenarnya mungkin untuk mendapatkan solusi yang lebih andal dengan menghapus file sementara segera setelah membukanya . Ini berfungsi karena sistem file Unix memungkinkan file untuk dihapus (tidak ditautkan , tepatnya) saat masih dibuka oleh satu atau beberapa proses. File tersebut dapat diakses secara normal melalui open filehandle, dan ruang yang mereka tempati pada disk hanya akan diklaim kembali oleh OS setelah proses terakhir memegang pegangan terbuka hingga file keluar.
Jadi, inilah cara paling andal dan portabel yang saya tahu untuk memastikan bahwa file sementara akan dihapus dengan benar setelah program keluar:
import java.io.File; import java.io.RandomAccessFile; import java.io.IOException; public class TempFileTest { public static void main(String[] args) { try { // create a temp file File temp = File.createTempFile("tempfiletest", ".tmp"); String path = temp.getAbsolutePath(); System.err.println("Temp file created: " + path); // open a handle to it RandomAccessFile fh = new RandomAccessFile (temp, "rw"); System.err.println("Temp file opened for random access."); // try to delete the file immediately boolean deleted = false; try { deleted = temp.delete(); } catch (SecurityException e) { // ignore } // else delete the file when the program ends if (deleted) { System.err.println("Temp file deleted."); } else { temp.deleteOnExit(); System.err.println("Temp file scheduled for deletion."); } try { // test writing data to the file String str = "A quick brown fox jumps over the lazy dog."; fh.writeUTF(str); System.err.println("Wrote: " + str); // test reading the data back from the file fh.seek(0); String out = fh.readUTF(); System.err.println("Read: " + out); } finally { // close the file fh.close(); System.err.println("Temp file closed."); } } catch (IOException e) { e.printStackTrace(); } } }
Pada sistem Unixish, menjalankan ini akan menghasilkan keluaran seperti berikut:
sedangkan di Windows, hasilnya terlihat sedikit berbeda:
Bagaimanapun, bagaimanapun, file temp tidak boleh tetap di disk setelah program berakhir.
Ps. Saat menguji kode ini di Windows, saya mengamati fakta yang agak mengejutkan: tampaknya, hanya membiarkan file temp tidak ditutup sudah cukup untuk mencegahnya dihapus . Tentu saja, ini juga berarti bahwa setiap kerusakan yang terjadi saat file temp digunakan akan menyebabkannya dibiarkan tidak terhapus, yang persis seperti yang kami coba hindari di sini.
AFAIK, satu-satunya cara untuk menghindarinya adalah dengan memastikan bahwa file temp selalu ditutup menggunakan
finally
blok. Tentu saja, Anda juga bisa menghapus file difinally
blok yang sama . Saya tidak yakin apa, jika ada, menggunakan yang.deleteOnExit()
benar-benar akan membuat Anda lebih dari itu.sumber
deleteOnExit()
, adalah bahwa jika sering dipanggil (katakanlah, dalam sistem yang menggunakan banyak file sementara baru), itu mungkin akan menyebabkan kebocoran memori (karena harus menghafal semua jalur yang perlu dihapus).Tidak akan, setidaknya tidak dengan Java. Jika Anda ingin file dihapus ketika JVM berakhir maka Anda perlu menelepon
tmp.deleteOnExit()
.sumber
dari: Cara menghapus file sementara di Java
Sebagai contoh,
File temp = File.createTempFile("abc", ".tmp"); temp.deleteOnExit();
Contoh di atas akan membuat file sementara bernama "abc.tmp" dan menghapusnya ketika program dihentikan atau ditutup .
Jika Anda ingin menghapus file temporary secara manual , Anda masih bisa menggunakan File.delete ().
sumber
File sementara digunakan untuk menyimpan data yang kurang penting dan sementara, yang harus selalu dihapus saat sistem Anda dihentikan. Praktik terbaiknya adalah menggunakan File.deleteOnExit () untuk melakukannya.
Sebagai contoh,
File temp = File.createTempFile("abc", ".tmp"); temp.deleteOnExit();
Contoh di atas akan membuat file sementara bernama "abc.tmp" dan menghapusnya ketika program dihentikan atau ditutup.
sumber
Anda dapat menghapus file secara manual sebelum menghentikan proses jika Anda mau, namun ketika proses dihentikan, file juga akan dihapus.
sumber
deleteOnExit()