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

StackOverflow https://stackoverflow.com/questions/421833

  •  05-07-2019
  •  | 
  •  

大多数人应该知道 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 ()锁?

有帮助吗?

解决方案

根据 JavaDoc

  

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

以下是 FileInputStream.close()

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

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top