scala.io.Source 这样用好像有问题吧
dogstar
2010-12-23
night_stalker 写道 原本以为会像 ruby 一样自动关闭的,结果真的是忽悠的么 ……
你忽悠了,广大青年啊... |
|
messi_18
2010-12-28
定义自己的工具吧,自己动手,丰衣足食。
定义: def use(path:String)(func: scala.io.BufferedSource => Unit) = { val src = scala.io.Source.fromFile(path) try { func(src)} finally { src.close } } 使用: use("c:/test.txt"){ file => file.getLines().foreach(println) } |
|
Purking
2011-01-26
果然是没有关闭!
fromFile, fromInputStream, fromXXX 最后都进入了 createBufferedSource 函数 def createBufferedSource( inputStream: InputStream, bufferSize: Int = DefaultBufSize, reset: () => Source = null, close: () => Unit = null )(implicit codec: Codec): BufferedSource = { // workaround for default arguments being unable to refer to other parameters val resetFn = if (reset == null) () => createBufferedSource(inputStream, bufferSize, reset, close)(codec) else reset new BufferedSource(inputStream, bufferSize)(codec) withReset resetFn withClose close // 这里最后创建好了 BufferedSource 后调用了 withReset 传入 resetFn 函数; 再调用 withClose 传入 close 函数; 两个都仅仅是附值,没有调用函数 } abstract class Source extends Iterator[Char] { .... def withReset(f: () => Source): this.type = { resetFunction = f // 仅仅将这个函数给当前这个 Source 实例 this } def withClose(f: () => Unit): this.type = { closeFunction = f this } .... def close(): Unit = if (closeFunction != null) closeFunction() // 需要你手动关闭 } Source.fromXXX 返回的是一个 BufferedSource 就是一个 abstract class Source 的实例; class BufferedSource extends scala.io.Source/*object class 是无法继承的*/ with scala.ScalaObject |