Tôi có một quá trình sẽ được gọi khá thường xuyên từ cron để đọc một tệp có các lệnh liên quan đến di chuyển nhất định trong đó. Quá trình của tôi cần phải đọc và ghi vào tệp dữ liệu này - và giữ nó khóa để ngăn các quá trình khác chạm vào nó trong thời gian này. Một quá trình hoàn toàn riêng biệt có thể được thực hiện bởi một người dùng để (tiềm năng) ghi/nối thêm vào cùng một tệp dữ liệu này. Tôi muốn hai quy trình này hoạt động tốt và chỉ truy cập từng tệp một.Java FileLock để Đọc và Viết
FileLock nio dường như là những gì tôi cần (viết các tập tin kiểu semaphore của riêng tôi), nhưng tôi gặp sự cố khi khóa nó để đọc. Tôi có thể khóa và viết tốt, nhưng khi cố gắng tạo khóa khi đọc tôi nhận được một NonWritableChannelException. Thậm chí có thể khóa tệp để đọc không? Có vẻ như một RandomAccessFile là gần gũi hơn với những gì tôi cần, nhưng tôi không thấy làm thế nào để thực hiện điều đó.
Đây là mã thất bại:
FileInputStream fin = new FileInputStream(f);
FileLock fl = fin.getChannel().tryLock();
if(fl != null)
{
System.out.println("Locked File");
BufferedReader in = new BufferedReader(new InputStreamReader(fin));
System.out.println(in.readLine());
...
Trường hợp ngoại lệ được ném trên dòng FileLock.
java.nio.channels.NonWritableChannelException
at sun.nio.ch.FileChannelImpl.tryLock(Unknown Source)
at java.nio.channels.FileChannel.tryLock(Unknown Source)
at Mover.run(Mover.java:74)
at java.lang.Thread.run(Unknown Source)
Nhìn vào JavaDocs, nó nói
ngoại lệ không được kiểm soát ném khi một nỗ lực được thực hiện để viết thư cho một kênh mà không được ban đầu được mở ra cho văn bản.
Nhưng tôi không nhất thiết phải viết thư cho nó. Khi tôi cố gắng tạo ra một FileOutpuStream, vv cho mục đích viết nó là hạnh phúc cho đến khi tôi cố gắng để mở một FileInputStream trên cùng một tập tin.
Bạn đã thử sử dụng ba cuộc gọi phương thức tham số, khóa FileLock (vị trí dài, kích thước dài, boolean được chia sẻ)? Tôi chưa bao giờ sử dụng FileLock trước đây nên tôi sẽ không đăng câu trả lời nhưng tôi nghĩ rằng việc sử dụng phương thức đó có thể hữu ích vì có vẻ như bạn cần khóa chung và không phải khóa độc quyền vì bạn muốn ghi vào tệp trong khi có một khóa trên đó. – ChadNC
Tôi nghĩ rằng ý định đó là để khóa chỉ một phần của một tập tin, tuy nhiên tôi muốn khóa toàn bộ tập tin để ngăn chặn và có thể tham nhũng. – bobtheowl2