ตามที่ทราบคำตอบอื่น ๆ ไฟล์ชั่วคราวที่สร้างด้วยFile.createTempFile()
จะไม่ถูกลบโดยอัตโนมัติเว้นแต่คุณจะร้องขออย่างชัดเจน
วิธีทั่วไปแบบพกพาในการทำเช่นนี้คือการเรียก.deleteOnExit()
ใช้File
อ็อบเจ็กต์ซึ่งจะกำหนดเวลาการลบไฟล์เมื่อ JVM สิ้นสุดลง อย่างไรก็ตามข้อเสียเล็กน้อยของวิธีนี้คือใช้ได้เฉพาะเมื่อ VM ยุติการทำงานตามปกติ ในการยุติที่ผิดปกติ (เช่น VM ขัดข้องหรือบังคับให้ยุติกระบวนการ VM) ไฟล์อาจยังคงถูกลบ
ในระบบ unixish (เช่นลินุกซ์) ก็เป็นไปได้จริงจะได้รับการแก้ปัญหาที่ค่อนข้างน่าเชื่อถือมากขึ้นโดยการลบไฟล์ชั่วคราวทันทีหลังจากที่เปิดมัน สิ่งนี้ใช้ได้ผลเนื่องจากระบบไฟล์ Unix อนุญาตให้ลบไฟล์ ( ยกเลิกการลิงก์เพื่อให้แม่นยำ) ในขณะที่ยังคงเปิดอยู่โดยกระบวนการอย่างน้อยหนึ่งกระบวนการ ไฟล์ดังกล่าวสามารถเข้าถึงได้ตามปกติผ่านทางจัดการไฟล์ที่เปิดอยู่และพื้นที่ที่ใช้ในดิสก์จะถูกเรียกคืนโดยระบบปฏิบัติการหลังจากกระบวนการสุดท้ายที่ถือที่จับเปิดเพื่อออกจากไฟล์
ดังนั้นนี่คือวิธีที่น่าเชื่อถือและพกพาง่ายที่สุดที่ฉันรู้เพื่อให้แน่ใจว่าไฟล์ชั่วคราวจะถูกลบอย่างถูกต้องหลังจากออกจากโปรแกรม
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();
}
}
}
บนระบบ Unixish การรันสิ่งนี้ควรสร้างผลลัพธ์ต่อไปนี้:
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.
ในขณะที่ Windows ผลลัพธ์มีลักษณะแตกต่างกันเล็กน้อย:
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.
อย่างไรก็ตามไม่ว่าในกรณีใดไฟล์ temp ไม่ควรอยู่ในดิสก์หลังจากโปรแกรมสิ้นสุดลง
Ps. ขณะที่การทดสอบรหัสนี้ใน Windows ผมสังเกตเห็นความเป็นจริงค่อนข้างน่าประหลาดใจที่เห็นได้ชัดเพียงออกจากไฟล์ชั่วคราว unclosed ก็เพียงพอที่จะให้มันจากการถูกลบ แน่นอนว่านี่หมายความว่าความผิดพลาดใด ๆ ที่เกิดขึ้นในขณะที่มีการใช้งานไฟล์ temp จะทำให้ไฟล์ถูกปล่อยทิ้งซึ่งเป็นสิ่งที่เราพยายามหลีกเลี่ยงที่นี่
AFAIK วิธีเดียวที่จะหลีกเลี่ยงปัญหานี้คือเพื่อให้แน่ใจว่าไฟล์ temp จะถูกปิดโดยใช้finally
บล็อกเสมอ แน่นอนคุณสามารถลบไฟล์ในfinally
บล็อกเดียวกันได้เช่นกัน ฉันไม่แน่ใจว่าถ้ามีอะไรการใช้.deleteOnExit()
จะทำให้คุณได้มากกว่านั้น