用法:
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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。