当相应的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 吗?