大多数人应该知道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()
调用时正确释放了锁,但这样做是否安全?该可关闭的JavaDoc说,"关闭此流并释放与之关联的所有系统资源." 我可以安全地假设我正在使用锁定close()
指定release()
的吗?
根据JavaDoc:
它通过调用release方法,关闭用于获取它的通道,或者通过Java虚拟机的终止(以先到者为准)来释放锁之前一直有效.
以下是内容 FileInputStream.close()
public void close() throws IOException { if (channel != null) channel.close(); close0(); }
看起来close
在流上关闭了释放锁的通道.