我要删除文件时应该对它进行锁定吗?

时间:2018-10-30 12:43:23

标签: java nio delete-file filelock

我在本地文件系统上有一堆文件。我的服务器将提供这些文件。在某些情况下,服务器将收到删除文件的指令。 目前,我正在使用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);
                    }

这似乎按预期工作。我还是想知道这是否安全,或者是否有更好的方法?

1 个答案:

答案 0 :(得分:1)

删除文件时文件锁定不起作用。文件锁定仅在某些其他进程要编辑同一文件时才起作用。在删除文件之前,您需要释放锁并关闭频道