Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当相应的流关闭时,Java FileChannel锁是关闭的还是必须显式关闭它们?_Java_Scala_File Io_Locking - Fatal编程技术网

当相应的流关闭时,Java FileChannel锁是关闭的还是必须显式关闭它们?

当相应的流关闭时,Java FileChannel锁是关闭的还是必须显式关闭它们?,java,scala,file-io,locking,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 Pr

例如,我的代码目前看起来如下所示。是否需要显式调用
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
}

根据javadoc:

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


。。。我假设关闭流会关闭底层通道。

想象它会被释放,但好奇的是,我在最后一个块中检查了它:

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

当你关上作家的门时,它似乎被清理干净了。

当我用同样的怀疑在谷歌上搜索时,这个问题出现了

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

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

我如何测试:

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

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

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