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

时间:2009-01-07 19:55:57

标签: java nio filelock

大多数人应该知道close()也会关闭所有流使用。

这允许以下代码:

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

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

但它是否也适用于FileLock s?

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 个答案:

答案 0 :(得分:8)

根据JavaDoc

  

在锁定之前它仍然有效   通过调用发布版本发布   方法,通过关闭通道   习惯于获得它,或者通过它   终止Java虚拟   机器,以先到者为准。

以下是FileInputStream.close()

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

看起来流上的close会关闭释放锁定的频道。

答案 1 :(得分:1)

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