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
这无疑是一个陷阱了。
|