2009-01-07 20 views
11

正如大多数人应该知道的close()也关闭任何流使用。使用Java的FileLock时,可以让close()自动执行lock.release()吗?

这使得后续代码:

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

这是很好的,因为我们并不需要FileInputStream参考,并记得要关闭它。

但它也适用于FileLock

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()的锁吗?

回答

7

按照JavaDoc

直到锁是 通过调用释放 方法释放它仍然有效,通过关闭信道 用于采集,或由 终止Java虚拟 机器,以先到者为准。

这里是FileInputStream.close()

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

它看起来像close流上的内容关闭其解除锁定的频道。

1

是的。

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

相关问题