Diğer cevaplar not olarak oluşturulan geçici dosyalar File.createTempFile()
olacak değil açıkça istemedikçe otomatik olarak silinecektir.
Bunu yapmanın genel, taşınabilir yolu .deleteOnExit()
, File
nesneyi çağırmaktır ; bu , JVM sona erdiğinde dosyayı silinmek üzere zamanlayacaktır. Bununla birlikte, bu yöntemin küçük bir dezavantajı, yalnızca VM normal şekilde sona erdiğinde işe yaramasıdır; anormal bir sonlandırmada (yani, bir VM çökmesi veya VM sürecinin zorunlu sonlandırılması), dosya silinmemiş kalabilir.
Unixish sistemlerinde (Linux gibi), geçici dosyayı açtıktan hemen sonra silerek biraz daha güvenilir bir çözüm elde etmek aslında mümkündür . Bu işe yarar çünkü Unix dosya sistemleri bir dosyanın bir veya daha fazla işlem tarafından açık tutulurken silinmesine ( kesin olarak bağlantısız) izin verir . Bu tür dosyalara normal olarak açık dosya tanıtıcısı aracılığıyla erişilebilir ve diskte kapladıkları alan, yalnızca dosya çıkışına açık bir tutamaç tutan son işlemden sonra işletim sistemi tarafından geri kazanılacaktır.
İşte programdan çıktıktan sonra geçici bir dosyanın düzgün şekilde silinmesini sağlamanın bildiğim en güvenilir ve taşınabilir yolu:
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();
}
}
}
Bir Unixish sisteminde, bunu çalıştırmak aşağıdaki çıktıya benzer bir şey üretmelidir:
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.
oysa Windows'ta çıktı biraz farklı görünüyor:
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.
Her iki durumda da, program bittikten sonra geçici dosya diskte kalmamalıdır.
Ps. Bu kodu Windows'ta test ederken oldukça şaşırtıcı bir gerçek gözlemledim: Görünüşe göre geçici dosyayı kapatmadan bırakmak, silinmesini önlemek için yeterli . Tabii ki, bu aynı zamanda geçici dosya kullanımdayken meydana gelen herhangi bir kilitlenmenin silinmemiş kalmasına neden olacağı anlamına gelir, bu da tam olarak burada kaçınmaya çalıştığımız şeydir .
AFAIK, bundan kaçınmanın tek yolu, geçici dosyanın her zaman bir finally
blok kullanılarak kapatılmasını sağlamaktır . Tabii ki, o zaman aynı finally
bloktaki dosyayı da silebilirsiniz . Ne olursa olsun, kullanmanın .deleteOnExit()
aslında bundan daha fazla kazanacağını bilmiyorum.