【发布时间】:2019-04-03 12:15:20
【问题描述】:
我在本地文件系统上有一堆文件。我的服务器将提供这些文件。在某些情况下,服务器会收到删除文件的指令。
目前我正在使用FileChannel.lock() 来获取文件的锁定,这主要是为了确保在我尝试删除文件时其他进程没有编辑该文件。
如果我成功获取了锁,我可以直接删除文件,还是需要先释放锁?
像这样:
FileOutputStream out = new FileOutputStream(file);
FileChannel channel = out.getChannel();
FileLock lock = channel.lock();
if(lock.isValid() && !lock.isShared()){
Path filePath = Paths.get(file.getPath());
Files.delete(filePath);
}
删除文件后是否需要解除锁定?
还是应该是这样(lock.release() 已添加):
FileOutputStream out = new FileOutputStream(file);
FileChannel channel = out.getChannel();
FileLock lock = channel.lock();
if(lock.isValid() && !lock.isShared()){
lock.release();
Path filePath = Paths.get(file.getPath());
Files.delete(filePath);
}
编辑:
所以事实证明上面的代码无论如何都行不通,因为你不能用FileInputStream 修改文件,因为它当然是只读的。我已经修改了上面的代码以使用FileOutputStream 代替,但它仍然不能正常工作,因为即使我从通道中释放了锁,file 对象仍然有锁。所以我像这样修改了代码:
FileOutputStream out = new FileOutputStream(file);
FileChannel channel = out.getChannel();
FileLock lock = channel.lock();
if(lock.isValid() && !lock.isShared()){
channel.close();
boolean deleted = file.delete();
logger.info("{} @{} File {} deleted: {}", id, type, file.getName(), deleted);
}
这似乎按预期工作。我仍然想知道这是否安全,或者是否有更好的方法来做到这一点?
【问题讨论】:
标签: java nio delete-file filelock