2010-02-01 20 views
6

Tôi đang cố xóa một tệp mà một chuỗi khác trong chương trình của tôi trước đó đã làm việc.Làm cách nào để tìm ra chuỗi nào đang khóa một tệp trong java?

Tôi không thể xóa tệp nhưng tôi không chắc chắn cách tìm ra luồng nào có thể đang sử dụng tệp.

Vậy làm cách nào để tìm ra chuỗi nào đang khóa tệp trong java?

+1

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ở. –

Trả lời

7

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, ReaderWriter, 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.

+1

Câu trả lời tuyệt vời, cảm ơn. – tomdee

+1

Bạn được chào đón. – BalusC

2

Về câu hỏi này, tôi cũng cố gắng tìm ra câu trả lời này, và yêu cầu this question và tìm câu trả lời:

Mỗi lần khi JVM chủ đề khóa một tập tin độc quyền, cũng JVM khóa một số Jave đối tượng, ví dụ, tôi thấy trong trường hợp của tôi:

  • sun.nio.fs.NativeBuffer
  • sun.nio.ch.Util $ BufferCache

Vì vậy, bạn chỉ cần tìm đối tượng Java bị khóa này và phân tích chúng và bạn tìm thấy chủ đề nào đã khóa tệp của bạn.

Tôi không chắc nó hoạt động nếu tệp chỉ mở (không bị khóa riêng), nhưng tôi chắc chắn rằng nó hoạt động nếu tệp bị khóa độc quyền bởi Thread (sử dụng java.nio.channels.FileLock, java.nio .channels.FileChannel và vân vân) thông tin

More thấy this question

Các vấn đề liên quan