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 
Global site tag (gtag.js) - Google Analytics