当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Scala util.Using用法及代码示例


用法:

object Using

用于执行自动资源管理的实用程序。它可用于执行使用资源的操作,然后以与创建资源相反的顺序释放资源。

用法

有多种方法可以使用 Using 自动管理资源。如果只需要管理单个资源, apply 方法最简单;它将资源打开、操作和资源释放包装在 Try 中。

例子:

import java.io.{BufferedReader, FileReader}
import scala.util.{Try, Using}

val lines: Try[Seq[String]] =
 Using(new BufferedReader(new FileReader("file.txt"))) { reader =>
   Iterator.continually(reader.readLine()).takeWhile(_ != null).toSeq
 }

如果您需要管理多个资源,则应使用 Using.Manager 。它允许管理任意多个资源,其创建、使用和释放都包含在 Try 中。

例子:

import java.io.{BufferedReader, FileReader}
import scala.util.{Try, Using}

val lines: Try[Seq[String]] = Using.Manager { use =>
 val r1 = use(new BufferedReader(new FileReader("file1.txt")))
 val r2 = use(new BufferedReader(new FileReader("file2.txt")))
 val r3 = use(new BufferedReader(new FileReader("file3.txt")))
 val r4 = use(new BufferedReader(new FileReader("file4.txt")))

 // use your resources here
 def lines(reader: BufferedReader): Iterator[String] =
   Iterator.continually(reader.readLine()).takeWhile(_ != null)

 (lines(r1) ++ lines(r2) ++ lines(r3) ++ lines(r4)).toList
}

如果您希望避免将管理和操作包装在 Try 中,则可以使用 Using.resource ,它会抛出发生的任何异常。

例子:

import java.io.{BufferedReader, FileReader}
import scala.util.Using

val lines: Seq[String] =
 Using.resource(new BufferedReader(new FileReader("file.txt"))) { reader =>
   Iterator.continually(reader.readLine()).takeWhile(_ != null).toSeq
 }

抑制行为

如果抛出两个异常(例如,通过操作和关闭资源),其中一个被重新抛出,另一个是 added to it as a suppressed exception 。如果两个异常具有不同的'severities'(见下文),则重新抛出较高严重性的异常,并将较低严重性的异常作为抑制异常添加到其中。如果两个异常的严重性相同,则重新抛出第一个抛出的异常,并将第二个抛出的异常作为抑制异常添加到其中。如果异常是 ControlThrowable ,或者如果它不支持抑制(请参阅带有 enableSuppression 参数的 Throwable 的构造函数),则会丢弃本应被抑制的异常。

异常的严重性从高到低排列如下:

  • java.lang.VirtualMachineError

  • java.lang.LinkageError

  • java.lang.InterruptedExceptionjava.lang.ThreadDeath

  • fatal exceptions ,不包括 scala.util.control.ControlThrowable

  • scala.util.control.ControlThrowable

  • 所有其他例外

当抛出两个以上的异常时,将前两个组合起来并如上所述重新抛出,并且每个连续抛出的异常在抛出时组合起来。

源码:

Using.scala

相关用法


注:本文由纯净天空筛选整理自scala-lang.org大神的英文原创作品 util.Using。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。