Tôi nhận thấy rằng java.io
và java.nio
việc triển khai tệp truy cập ngẫu nhiên hơi khác so với cách xử lý FileLocks
.Tệp truy cập ngẫu nhiên FileLock: java.io vs. java.nio
Dường như (trên Windows) java.io
cung cấp cho bạn khóa tệp bắt buộc và java.nio
cung cấp cho bạn khóa tệp tư vấn khi yêu cầu tương ứng. Khóa tệp bắt buộc có nghĩa là khóa giữ cho tất cả các quy trình và lưu giữ tư vấn cho các quy trình hoạt động tốt tuân theo cùng một giao thức khóa.
Nếu tôi chạy ví dụ sau, tôi có thể xóa tệp *.nio
theo cách thủ công, trong khi *.io
tệp sẽ không bị xóa.
import java.io.*;
import java.lang.management.ManagementFactory;
import java.nio.*;
import java.nio.channels.*;
import java.nio.file.*;
public class NioIoLock {
public static void main(String[] args) throws IOException, InterruptedException {
String workDir = System.getProperty("user.dir");
FileChannel channelIo, channelNio;
FileLock lockIo, lockNio;
// use io
{
String fileName = workDir
+ File.separator
+ ManagementFactory.getRuntimeMXBean().getName()
+ ".io";
File lockFile = new File(fileName);
lockFile.deleteOnExit();
RandomAccessFile file = new RandomAccessFile(lockFile, "rw");
channelIo = file.getChannel();
lockIo = channelIo.tryLock();
if (lockIo != null) {
channelIo.write(ByteBuffer.wrap("foobar".getBytes("UTF-8")));
}
}
// use nio
{
Path workDirPath = Paths.get(workDir);
Path file = workDirPath.resolve(
Paths.get(ManagementFactory.getRuntimeMXBean().getName() + ".nio"));
// open/create test file
channelNio = FileChannel.open(
file, StandardOpenOption.READ, StandardOpenOption.WRITE,
StandardOpenOption.CREATE, StandardOpenOption.DELETE_ON_CLOSE);
// lock file
lockNio = channelNio.tryLock();
if (lockNio != null) {
channelNio.write(ByteBuffer.wrap("foobar".getBytes("UTF-8")));
}
}
// do not release locks for some time
Thread.sleep(10000);
// release io lock and channel
if (lockIo != null && lockIo.isValid()) {
lockIo.release();
}
channelIo.close();
// release nio lock and channel
if (lockNio != null && lockNio.isValid()) {
lockNio.release();
}
channelNio.close();
}
}
Có lý do nào cho điều này không? Hai cái này có được coi là lựa chọn thay thế hay chúng có nghĩa là cùng tồn tại vô thời hạn?
Việc thêm 'SYNC, DSYNC' vào phiên bản nio có tạo sự khác biệt không? Sau đó, nó sẽ có được một xem xét hiệu suất. –
thêm 'SYNC, DSYNC' không tạo sự khác biệt – starikoff