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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当相应的Stream关闭或我是否必须明确关闭它们时,Java FileChannel锁是否关闭?相关的知识,希望对你有一定的参考价值。

例如,我的代码目前看起来类似于以下内容。我需要明确调用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
}
答案

根据FileLock的javadoc:

“文件锁定对象最初是有效的。它通过调用释放方法释放锁定,通过关闭用于获取它的通道,或者通过Java虚拟机的终止(以先到者为准)来保持有效。”

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

另一答案

想象它会被释放,但我很好奇,因为我在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

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

另一答案

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

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

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

我是如何测试的:

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

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

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

以上是关于当相应的Stream关闭或我是否必须明确关闭它们时,Java FileChannel锁是否关闭?的主要内容,如果未能解决你的问题,请参考以下文章

当目标系统关闭时,停止 Spring Cloud Stream @StreamListener 监听

Dart:我必须取消 Stream 订阅并关闭 StreamSinks 吗?

当 catch 语句没有显式捕获异常对象时,它们是不是更快/更便宜? [关闭]

Java - 创建类关闭时是否会破坏对象引用?

在退出/崩溃时关闭服务器套接字

电子邮件已完成但发送电子邮件窗口未关闭? [复制]