加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么Scala Source不关闭底层的InputStream?

发布时间:2020-12-16 09:32:56 所属栏目:安全 来源:网络整理
导读:我使用Scala Source.fromFile,但是一旦读取文件,我似乎找不到一个很好的方法来关闭底层的InputStream。 这是我的代码将失败与AssertionError因为该文件不能被删除。 def main(args : Array[String]) : Unit = { val myFile = new File("c:/tmp/doodah.txt"
我使用Scala Source.fromFile,但是一旦读取文件,我似乎找不到一个很好的方法来关闭底层的InputStream。

这是我的代码将失败与AssertionError因为该文件不能被删除。

def main(args : Array[String]) : Unit = {

    val myFile = new File("c:/tmp/doodah.txt")
    var src = Source.fromFile(myFile)
    src.getLines.foreach(l => print(l))

    val deleted: Boolean = myFile.delete

    assert (deleted,"File was not deleted - maybe the stream hasn't been closed in Source")

  }

Source有一个叫做reset的方法,但是所有这些都是从文件中重新创建源。

内部源创建一个具有密切方法的底层BufferedSource。但是这并不是从Source公开的。

我希望Source会在文件的内容被读取后释放文件句柄,但似乎并没有这样做。

到目前为止,我看到的最好的解决方法是将Source投入到BufferedSource并调用close。

try {
  src.getLines.foreach(l => print(l))
}
finally src match { case b: scala.io.BufferedSource => b.close }

或者,我可以从InputStream创建一个源,并自己管理关闭。

但这似乎有点脏。使用Source时你应该如何释放文件句柄?

解决方法

Scala.io._是为支持XML库和编译器而唯一目的而创建的准系统黑客攻击。它设计不当,受到许多问题的困扰。 Scala 2.8将声称其改进版本,尽管几乎没有什么可写回家。

感兴趣的各方正在进行第三方的努力来开发一个完善的Scala I / O库。它旨在带回JDK7 I / O重新设计的经验教训,同时提供Scala-ish API。

同时,只要您的应用程序绊倒了现有库的设计问题,就使用Java库。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读