Tôi không có câu trả lời thẳng (và tôi cũng không nghĩ rằng có một điều này được kiểm soát ở cấp hệ điều hành (không phải ở cấp độ JVM) và tôi cũng không thực sự thấy giá trị của câu trả lời (bạn vẫn không thể đóng tệp lập trình khi bạn đã tìm ra chuỗi đó), nhưng tôi nghĩ bạn chưa biết rằng không có khả năng xóa thường xảy ra khi tệp vẫn mở. Điều này có thể xảy ra khi bạn làm không phải gọi rõ ràng Closeable#close()
trên InputStream
, OutputStream
, Reader
hoặc Writer
được xây dựng xung quanh File
được đề cập.
bản demo cơ bản:
public static void main(String[] args) throws Exception {
File file = new File("c:/test.txt"); // Precreate this test file first.
FileOutputStream output = new FileOutputStream(file); // This opens the file!
System.out.println(file.delete()); // false
output.close(); // This explicitly closes the file!
System.out.println(file.delete()); // true
}
Nói cách khác, đảm bảo rằng trong suốt toàn bộ những thứ Java IO của bạn mã là đúng đóng các nguồn lực sau khi sử dụng. The normal idiom là thực hiện việc này trong the try-with-resources
statement, để bạn có thể chắc chắn rằng tài nguyên sẽ được giải phóng, ngay cả trong trường hợp của IOException
. Ví dụ.
try (OutputStream output = new FileOutputStream(file)) {
// ...
}
Làm điều đó cho bất kỳ InputStream
, OutputStream
, Reader
và Writer
, vv bất cứ điều gì thực hiện AutoCloseable
, mà bạn đang mở mình (sử dụng từ khóa new
). Điều này về mặt kỹ thuật là không cần thiết trên một số triển khai nhất định, chẳng hạn như ByteArrayOutputStream
, nhưng vì mục đích rõ ràng, chỉ cần tuân thủ thành ngữ gần cuối cùng ở khắp mọi nơi để tránh quan niệm sai lầm và tái cấu trúc-lỗi.
Trong trường hợp bạn chưa sử dụng Java 7 trở lên, thay vào đó hãy sử dụng thành ngữ bên dưới try-finally
.
OutputStream output = null;
try {
output = new FileOutputStream(file);
// ...
} finally {
if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
}
Hy vọng điều này sẽ giúp giảm bớt nguyên nhân gốc rễ của vấn đề cụ thể của bạn.
Files được lokced bởi quá trình, chứ không phải bởi thread. Như đã đề cập, bạn phải đóng một tệp trước khi bạn có thể xóa nó. Tôi đề nghị bạn bắt đầu bằng cách nhìn vào nơi tập tin được mở. –