我注意到
看起来(在 Windows 上),
如果我运行以下示例,则可以手动删除
java.io
和 java.nio
中的随机访问文件实现在处理 FileLocks
方面略有不同。看起来(在 Windows 上),
java.io
给你一个强制性文件锁,而 java.nio
在请求时给你一个建议性文件锁。强制性文件锁意味着锁适用于所有进程,而建议性锁适用于遵循相同锁定协议的良好行为进程。如果我运行以下示例,则可以手动删除
*.nio
文件,而 *.io
文件则无法被删除。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();
}
}
这是有原因的吗?这两者是否被视为替代品,还是它们将无限期共存?
SYNC, DSYNC
添加到nio版本中是否会有所不同?那就需要考虑性能问题了。 - Joop EggenSYNC, DSYNC
没有任何区别。 - starikoff