13

正如大多数人应该知道的那样,close()也关闭了任何流使用。

这允许以下代码:

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

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

但它也适用于FileLocks 吗?

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()

4

2 回答 2

9

根据JavaDoc

在通过调用 release 方法、关闭用于获取它的通道或终止 Java 虚拟机(以先到者为准)释放锁之前,它一直有效。

这里是内容FileInputStream.close()

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

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

于 2009-01-07T20:11:30.837 回答
1

是的。

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

于 2009-01-07T19:59:14.480 回答