Java的FileChannel锁在相应的流关闭时是否也关闭,还是我必须显式地关闭它们?

4

比如,我的代码目前看起来像下面这样。当FileOutputStream关闭时,我是否需要显式调用lock.release或者它会自动释放?

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个回答

5
根据FileLock的javadoc文档:

"文件锁定对象最初是有效的。它保持有效,直到通过调用释放方法、关闭用于获取它的通道或Java虚拟机的终止来释放锁定为止。"

我认为关闭流会关闭底层通道。

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

似乎在关闭写作程序时,它会被清除。

0

当我谷歌搜索时,遇到了这个问题。

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

我可以确认,是的,简单地关闭写入器将释放锁定。您甚至不需要手动关闭位于写入器下的流。

我的测试方法:

1)我在Eclipse中以调试模式运行代码。 2)在写入和刷新文件后(在关闭之前),我尝试使用Windows Explorer删除文件。如预期的那样,由于锁定而失败。 3)一旦我通过writer.close()方法步进,但在完成运行之前,我再次尝试删除文件。它毫无问题地被删除了。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接