Như các câu trả lời khác lưu ý, các tệp tạm thời được tạo bằng File.createTempFile()
sẽ không tự động bị xóa trừ khi bạn yêu cầu rõ ràng.
Các chung, cách cầm tay để làm điều này là để gọi .deleteOnExit()
trên File
đối tượng, trong đó sẽ sắp xếp các tập tin để xóa khi JVM chấm dứt. Tuy nhiên, một nhược điểm nhỏ của phương pháp này là nó chỉ hoạt động nếu VM kết thúc bình thường; khi kết thúc bất thường (tức là sự cố máy ảo hoặc buộc phải chấm dứt quy trình máy ảo), tệp có thể vẫn không bị xóa.
Trên các hệ thống Unixish (chẳng hạn như Linux), thực sự có thể có được một giải pháp đáng tin cậy hơn bằng cách xóa tệp tạm thời ngay sau khi mở nó . Điều này hoạt động vì hệ thống tệp Unix cho phép xóa một tệp ( chính xác là hủy liên kết ) trong khi nó vẫn được mở bởi một hoặc nhiều quy trình. Các tệp như vậy có thể được truy cập bình thường thông qua xử lý tệp đang mở và dung lượng chúng chiếm trên đĩa sẽ chỉ được Hệ điều hành thu hồi sau khi quá trình cuối cùng giữ một chốt mở để tệp thoát ra.
Vì vậy, đây là cách đáng tin cậy và di động nhất mà tôi biết để đảm bảo rằng tệp tạm thời sẽ được xóa đúng cách sau khi chương trình thoát ra:
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();
}
}
}
Trên hệ thống Unixish, chạy điều này sẽ tạo ra một cái gì đó giống như đầu ra sau:
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.
trong khi trên Windows, đầu ra trông hơi khác một chút:
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.
Tuy nhiên, trong cả hai trường hợp, tệp tạm thời không nên vẫn còn trên đĩa sau khi chương trình kết thúc.
Ps. Trong khi thử nghiệm mã này trên Windows, tôi đã quan sát thấy một thực tế khá ngạc nhiên: rõ ràng, chỉ cần để tệp tạm thời không bị xóa là đủ để giữ cho nó không bị xóa . Tất nhiên, điều này cũng có nghĩa là bất kỳ sự cố nào xảy ra trong khi tệp tạm thời đang được sử dụng sẽ khiến nó không bị xóa, đó chính là điều chúng tôi đang cố gắng tránh ở đây.
AFAIK, cách duy nhất để tránh điều này là đảm bảo rằng tệp tạm thời luôn được đóng bằng cách sử dụng một finally
khối. Tất nhiên, sau đó bạn cũng có thể xóa tệp trong cùng một finally
khối. Tôi không chắc điều gì, nếu có, việc sử dụng .deleteOnExit()
thực sự sẽ giúp bạn đạt được điều đó.