Tôi đang ánh xạ một tệp ("sample.txt") vào bộ nhớ bằng cách sử dụng FileChannel.map()
và sau đó đóng kênh bằng cách sử dụng fc.close()
. Sau này khi tôi ghi được vào file sử dụng FileOutputStream, tôi nhận được lỗi sau:Làm thế nào để unmap một tập tin từ bộ nhớ ánh xạ bằng cách sử dụng FileChannel trong java?
java.io.FileNotFoundException: sample.txt (The requested operation cannot be per formed on a file with a user-mapped section open)
File f = new File("sample.txt");
RandomAccessFile raf = new RandomAccessFile(f,"rw");
FileChannel fc = raf.getChannel();
MappedByteBuffer mbf = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
fc.close();
raf.close();
FileOutputStream fos = new FileOutputStream(f);
fos.write(str.getBytes());
fos.close();
Tôi đoán này có thể là do tập tin được vẫn ánh xạ vào bộ nhớ ngay cả sau khi tôi đóng FileChannel
. Tôi có đúng không ?. Nếu vậy, làm thế nào tôi có thể "unmap" các tập tin từ bộ nhớ? (Tôi không thể tìm thấy bất kỳ phương pháp cho điều này trong API). Cảm ơn.
Edit: Hình như nó (thêm một phương pháp unmap) đã được gửi như RFE để ánh nắng mặt trời một thời gian trở lại: http://bugs.sun.com/view_bug.do?bug_id=4724038
Tôi cũng gặp vấn đề tương tự. Trong trường hợp của tôi, tôi đã cố gắng ánh xạ hàng ngàn tệp vào bộ nhớ và kết quả là 'OutOfMemoryError', mà tôi tin là kết quả của việc xử lý tệp hết. Không có công cụ để unmap dẫn đến hành vi không tiên đoán, mặc dù bản đồ sẽ cố gắng 'ngủ (100)' & 'System.gc()' trên 'OutOfMemoryError' - nó chỉ trì hoãn các co giật. –