最后在

时间:2017-09-21 20:47:37

标签: scala

在下面的代码中,我正在阅读否。来自文件的行。如果出现问题,我会关闭文件指针。但是如何判断f是否包含有效指针?

def countLines(filename:String):Option[Int] = {
    try{
        val f = Source.fromFile(filename)
        println(s"no. of lines ${f.getLines().size}")
        Some(f.getLines.size)
    } catch  {
        case ex: FileNotFoundException => {
            println(s"file ${filename} not found")
            None
        }
    } finally {
        //f might not be a valid pointer depending on when the error occured
    }
}

我正在阅读的书使用var来维护状态(如果f有效或无效)但是我试图避免它只是为了只使用不可变变量。

def countLines(filename:String):Option[Int] = {

        var f:Option[Source] = None
        try{
            f = Some(Source.fromFile(filename))
            println(s"no. of lines ${f.get.getLines().size}")
            Some(f.get.getLines.size)
        } catch  {
            case ex: FileNotFoundException => {
                println(s"file ${filename} not found")
                None
            }
        } finally {
            for(i<-f){
                println("closing file")
                i.close()
            }
        }
    }

4 个答案:

答案 0 :(得分:0)

您如何看待这个? 如果你想要Scala-way - 我认为这是你的任务的好例子:

  def countLines(filename: String): Try[Int] = Try(Source.fromFile(filename).getLines.toList.size)

  def test() = {
      val filename = "/etc/passwd"
      countLines(filename) match {
                  case Success(n) => println(n)
                  case Failure(f) => println(f)
                }
       }

当n - 是我们的行数时,f - 是Throwable。

答案 1 :(得分:0)

这个怎么样:

def countLines(filename: String): Option[Int] = {
  val file = Try(Source.fromFile(filename))
  val count = file.map(_.getLines().size)
  (for {
    _ <- count.recoverWith { case _ => file.map(_.close()) }
    lineCount <- count
  } yield lineCount).toOption
}

让我们分析一下:

  • 如果文件不存在,我们将失败Try实例,方法返回None。在这种情况下,您不需要清除任何资源,因为没有创建实际流。
  • 如果getLines由于任何原因或其他任何原因在处理过程中失败,我们将在第一行中关闭创建的流进行理解

希望有所帮助

答案 2 :(得分:0)

简单地说,这是怎么回事:

def numLines(fileName:String):Option[Int] = {
  try {
    val f = scala.io.Source.fromFile(fileName)
    try { Some(f.getLines.size) }
    catch { case ex: IOException =>
      Console.err.println("i/o excetion")
      None
    }
    finally { f.close() }
  }
  catch {
    case ex: FileNotFoundException =>
      Console.err.println("file not found")
      None
  }
}

答案 3 :(得分:0)

Try()。即使io失败,这也会关闭getLines()资源,但前提是fromFile()成功。

import scala.util.Try

def countLines(filename: String): Option[Int] =
  Try(io.Source.fromFile(filename)).fold(_ => None, {f =>
    val count = Try(f.getLines().length)
    f.close()
    count.toOption
  })