用法:
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.InterruptedException
和java.lang.ThreadDeath
fatal exceptions ,不包括
scala.util.control.ControlThrowable
scala.util.control.ControlThrowable
所有其他例外
当抛出两个以上的异常时,将前两个组合起来并如上所述重新抛出,并且每个连续抛出的异常在抛出时组合起来。
源码:
- Using.scala
相关用法
- Scala util.DynamicVariable用法及代码示例
- Scala util.Either用法及代码示例
- Scala util.Try用法及代码示例
- Scala unapplySeq()用法及代码示例
- Scala Tabulate.sliding用法及代码示例
- Scala ArrayBuffer.inits用法及代码示例
- Scala long.BitwiseOr用法及代码示例
- Scala StringBuilder.partitionMap用法及代码示例
- Scala List distinct()用法及代码示例
- Scala DefaultMap.sizeIs用法及代码示例
- Scala StrictOptimizedIterableOps.sliding用法及代码示例
- Scala Searching.SearchResult用法及代码示例
- Scala ::.collectFirst用法及代码示例
- Scala TreeSet diff()用法及代码示例
- Scala Char getClass()用法及代码示例
- Scala int.Min用法及代码示例
- Scala IntMap.groupMap用法及代码示例
- Scala Map3.mkString用法及代码示例
- Scala IterableOnceOps.flatMap用法及代码示例
- Scala IndexedSeqOps.lengthIs用法及代码示例
- Scala Map3.addString用法及代码示例
- Scala WrappedString.scanRight用法及代码示例
- Scala String compareToIgnoreCase()用法及代码示例
- Scala List drop()用法及代码示例
- Scala ofDouble.inits用法及代码示例
注:本文由纯净天空筛选整理自scala-lang.org大神的英文原创作品 util.Using。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。