这是代码中存在问题的部分:
FileChannel fileChannel = FileChannel.open(filePath, StandardOpenOption.WRITE);
fileChannel.force(true);
FileLock lock = fileChannel.lock();
fileChannel.truncate(0);
fileChannel.write(buffer);
lock.release();
fileChannel.close();
buffer
是一个ByteBuffer
,在此代码之前填充了一些数据。
因此,此代码在一个线程中定期完成,没有其他线程使用此锁或访问同一文件。发生的情况是,当我在程序运行时使用记事本访问文件时,我有时会得到OverlappingFileLockException
。如果我捕获该异常,线程将循环并一遍又一遍地生成相同的异常,即使我关闭记事本也是如此。我有时也会收到错误:The requested operation cannot be performed on a file with a user-mapped section open
,这可能与OverlappingFileLockException
有关,也可能无关,但有时出于同样的原因,当我使用记事本打开文件或在程序运行时打开文件属性时,也会发生这种情况。
确保释放锁,即使从写入尝试中引发 I/O 异常。
FileChannel fileChannel = FileChannel.open(filePath,
StandardOpenOption.WRITE);
fileChannel.force(true);
FileLock lock = fileChannel.lock();
try {
fileChannel.truncate(0);
fileChannel.write(buffer);
} finally {
lock.release();
fileChannel.close();
}