大多数人应该知道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()
锁?
答案 0 :(得分:8)
根据JavaDoc:
在锁定之前它仍然有效 通过调用发布版本发布 方法,通过关闭通道 习惯于获得它,或者通过它 终止Java虚拟 机器,以先到者为准。
以下是FileInputStream.close()
public void close() throws IOException {
if (channel != null)
channel.close();
close0();
}
看起来流上的close
会关闭释放锁定的频道。
答案 1 :(得分:1)
是
锁取决于文件描述符。当没有表示进程中文件的文件描述符时,就不会有与之关联的锁。