當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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