在下面的代码中,我正在阅读否。来自文件的行。如果出现问题,我会关闭文件指针。但是如何判断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()
}
}
}
答案 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
})