使用Java的FileLock时,是否可以让close()自动执行lock.release()操作?

13

大多数人应该知道close()也会关闭使用的任何流。

这使得以下代码成为可能:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
...
br.close();

这很好,因为我们不需要引用FileInputStream并记得关闭它。

但对于FileLock也适用吗?

final FileInputStream fis = new FileInputStream(new File("buffer.txt"));
final FileChannel c = fis.getChannel();
final FileLock lock = c.lock(0L, Long.MAX_VALUE, true);
final BufferedReader br = new BufferedReader(new InputStreamReader(fis));

try {
    while(br.ready()) {
        System.out.println(br.readLine());
    }
} finally {
    br.close();
}

我已经尝试过这段代码,当调用br.close()时,锁正确释放了。但是这样做安全吗?Closeable JavaDoc中说,“关闭此流并释放与之关联的任何系统资源。” 我可以安全地假设我正在按照规定使用close()release()锁吗?

2个回答

9
根据JavaDoc的说明:

锁定有效直到通过调用释放方法、关闭用于获取锁定的通道或者Java虚拟机终止(以先发生者为准)。

FileInputStream.close()的内容如下:

public void close() throws IOException {
    if (channel != null)
        channel.close();
    close0();
}

看起来,流上的close关闭了通道,从而释放了锁。


1

是的。

锁依赖于文件描述符。当进程中没有表示文件的文件描述符时,就不会有与之关联的锁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接