使用Java的FileLock时,是否可以让close()自动执行lock.release()?
题
大多数人应该知道 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
看起来会关闭释放锁的频道。
其他提示
是
锁取决于文件描述符。当没有表示进程中文件的文件描述符时,就不会有与之关联的锁。
不隶属于 StackOverflow