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()
pada File
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 {
File temp = File.createTempFile("tempfiletest", ".tmp");
String path = temp.getAbsolutePath();
System.err.println("Temp file created: " + path);
RandomAccessFile fh = new RandomAccessFile (temp, "rw");
System.err.println("Temp file opened for random access.");
boolean deleted = false;
try {
deleted = temp.delete();
} catch (SecurityException e) {
}
if (deleted) {
System.err.println("Temp file deleted.");
} else {
temp.deleteOnExit();
System.err.println("Temp file scheduled for deletion.");
}
try {
String str = "A quick brown fox jumps over the lazy dog.";
fh.writeUTF(str);
System.err.println("Wrote: " + str);
fh.seek(0);
String out = fh.readUTF();
System.err.println("Read: " + out);
} finally {
fh.close();
System.err.println("Temp file closed.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Pada sistem Unixish, menjalankan ini akan menghasilkan keluaran seperti berikut:
Temp file created: /tmp/tempfiletest587200103465311579.tmp
Temp file opened for random access.
Temp file deleted.
Wrote: A quick brown fox jumps over the lazy dog.
Read: A quick brown fox jumps over the lazy dog.
Temp file closed.
sedangkan di Windows, hasilnya terlihat sedikit berbeda:
Temp file created: C:\DOCUME~1\User\LOCALS~1\Temp\tempfiletest5547070005699628548.tmp
Temp file opened for random access.
Temp file scheduled for deletion.
Wrote: A quick brown fox jumps over the lazy dog.
Read: A quick brown fox jumps over the lazy dog.
Temp file closed.
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 di finally
blok yang sama . Saya tidak yakin apa, jika ada, menggunakan yang .deleteOnExit()
benar-benar akan membuat Anda lebih dari itu.