Tôi đã phát hiện ra cơ chế khóa Tệp Java là một sai lầm thực sự vì nó không thể thực hiện quy tắc thứ nhất về khóa - chặn trên cuộc gọi để khóa! Trừ khi tôi sai - một cuộc gọi để khóa() sẽ ném một ngoại lệ nếu một ứng dụng đã duy trì một khóa trên tập tin, mà tôi biết sẽ là trường hợp trong ứng dụng của tôi. Tôi đã nhìn qua một số câu trả lời ở đây và không may tôi không sử dụng Java 7.Chặn tệp Java không có ngoại lệ; chờ đợi trên khóa
Có ai có đề xuất về làm thế nào tôi có thể xử lý chờ đợi vào một khóa tập tin độc quyền mà không đặt bản thân mình trong một vòng lặp while(true)
:)
CHỈNH SỬA sau câu trả lời của Aubin (sao chép từ nhận xét):
Điều tôi muốn làm là truy cập một tệp lớn sau khi được sao chép vào một thư mục rồi xử lý. Mã của tôi rất đơn giản ...
public boolean ifFileReady(File file) {
boolean ready = false;
FileLock lock = null;
FileChannel channel = null;
try {
channel = new RandomAccessFile(file, "rw").getChannel();
lock = channel.lock();
lock.release();
ready = true;
}
catch(IOException e) {
// Always Here
}
finally
{
if (channel != null)
channel.close();
}
return ready;
}
Tôi không bao giờ chặn khóa. Nó luôn luôn ném
[Java 7 là bắt buộc ngay bây giờ] (http://www.oracle.com/technetwork/java/eol-135779.html) – Aubin
Vui lòng đăng theo dõi ngăn xếp, vì IOException có thể có một số nguồn gốc hoặc nguyên nhân, như quyền truy cập từ chối. Hãy thử "r" chỉ trong 'RandomAccessFile (tập tin," rw ")' thay cho "rw". – Aubin