gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:43:57 26 4
gpt4 key购买 nike

我正在使用 Scala Source.fromFile但是我似乎找不到将它发送到 close 的好方法标的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然而,这只是从文件中重新创建源代码。

内部 Source创建底层 BufferedSource有一个 close方法。但是,这不是从 Source 公开的。

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

到目前为止,我见过的最好的解决方法是基本上转换 SourceBufferedSource并调用 close .
try {
src.getLines.foreach(l => print(l))
}
finally src match { case b: scala.io.BufferedSource => b.close }

或者我可以创建一个 Source来自 InputStream并自己管理关闭。

然而,这似乎有些肮脏。使用 Source 时应该如何释放文件句柄?

最佳答案

Scala.io._是为支持 XML 库和编译器的唯一目的而创建的准系统 hack。它的设计很糟糕,并且存在许多问题。 Scala 2.8 将声称是它的改进版本,尽管几乎没有什么可写的。

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

同时……每当您的应用程序偶然发现当前库的设计问题时,请使用 Java 库。

关于scala - 为什么 Scala Source 不关闭底层 InputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1762843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com