例如,我的代码目前看起来类似于以下内容。我是否需要明确调用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
}
答案 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的服务器连接对象,否则将发生连接内存泄漏。