scala.io.Source 这样用好像有问题吧

messi_18 2010-12-17
val str = scala.io.Source.fromFile("test.txt").mkString()


底层的stream没有关闭啊!很多例子里都这么写,我觉得很有问题。
应该这样写吧:
var src: scala.io.Source = null
try {
  src = scala.io.Source.fromFile("test.txt")
  val str = src.mkString()
  println(str)
} finally {
  if (src != null) src.close()
}

大家的见解呢?
night_stalker 2010-12-17
Source 在 iterate 完毕后会自动关闭流。
如果出现了异常,也会关闭流,所以不需要写那些没用的东西。
messi_18 2010-12-17
但是我在代码中,没有找到Source调用关闭流 的动作。
messi_18 2010-12-21
马丁的书中的例子也是这样的,我感到很纳闷。二楼的哥们能解释的在具体一些吗,我真的在代码中没有找到证明。谢谢了。
Eastsun 2010-12-21
是有问题的,必须手动关闭:Source#close()
Eastsun 2010-12-21
可以参看io.Source的源代码,或者这里https://lampsvn.epfl.ch/trac/scala/ticket/2244
其中extempore提到了:You do have to call close, it won't do it for you.
llh110220 2010-12-22
流有关闭的,查看源代码就可以看到https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/library/scala/io/Source.scala?rev=18487

对于打开的所有流,都有() => inputStream.close() 来关闭流
Eastsun 2010-12-22
llh110220 写道
流有关闭的,查看源代码就可以看到https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/library/scala/io/Source.scala?rev=18487

对于打开的所有流,都有() => inputStream.close() 来关闭流


这只是作为参数传入构造函数,Source本身不会自动去调用这个函数,必须手动调用


night_stalker 2010-12-22
原本以为会像 ruby 一样自动关闭的,结果真的是忽悠的么 ……
messi_18 2010-12-22
这无疑是一个陷阱了。
Global site tag (gtag.js) - Google Analytics