当相应的Stream关闭或我是否必须明确关闭它们时,Java FileChannel锁是否关闭?

时间:2010-12-29 05:43:05

标签: java scala file-io locking

例如,我的代码目前看起来类似于以下内容。我是否需要明确调用lock.release,还是在FileOutputStream关闭时自动发布?

var os:FileOutputStream = null
var writer:PrintWriter = null
try {
  os = new FileOutputStream(name, false)
  val lock = os.getChannel().tryLock
  if(lock != null) {
    writer = new PrintWriter(new BufferedWriter(new
      OutputStreamWriter(os)))
    (write stuff to file)
  } else {
    (error stuff)
  }
} finally {
  if(writer != null) writer.close
  os.close
}

3 个答案:

答案 0 :(得分:5)

根据FileLock的javadoc:

  

“文件锁定对象最初有效。在通过调用释放方法,关闭用于获取它的通道或通过终止Java虚拟机来释放锁定之前,它仍然有效。 ,以先到者为准。“

...我假设关闭流关闭了底层渠道。

答案 1 :(得分:4)

想象一下它会被释放,但我很好奇,因为我在finally块中用它来检查它:

println("Lock: " + lock.isValid)
if (writer != null) writer.close
println("Lock: " + lock.isValid)
os.close
println("Lock: " + lock.isValid)

这就是结果:

Lock: true
Lock: false
Lock: false

当你关闭作家时,它似乎得到了清理。

答案 2 :(得分:0)

当我用同样的疑问搜索时出现了这个问题。

没有找到绝对答案,我做了一些测试测试。

我可以确认是的,只需关闭编写器即可释放锁定。您甚至不需要手动关闭编写器下的流。

我是如何测试的:

1)我在 debug 模式下运行Eclipse中的代码。 2)写入并刷新文件后(关闭前)我尝试使用Windows资源管理器删除该文件。正如预期的那样,由于锁定而失败。 3)一旦我完成了writer.close()方法,但在完成运行之前我再次尝试删除该文件。它删除它没有问题。

这清楚地告诉我,close()方法将导致释放锁。

注意:以上内容仅适用于JDK的File类。扩展java.io.File的库可能表现不同。例如,如果使用iSeries IfsJavaFile,则除非您还发布了特定于iSeries的服务器连接对象,否则将发生连接内存泄漏。