多くの例では、scala.io.Source
を使用して次のようにファイル全体を読み取ることができると説明されています。
val str = scala.io.Source.fromFile("test.txt").mkString()
ただし、基になるストリームを閉じることについては触れられていません。
ScalaがPythonのwith句などの便利な方法を提供しないのはなぜですか?便利そうに見えますが、難しくはありません。
Scalaで安全にこれを行う他のより良い方法はありますか?私はファイル全体を読み取ることを意味しますか?
完全を期すために
val testTxtSource = scala.io.Source.fromFile("test.txt")
val str = testTxtSource.mkString()
testTxtSource.close()
物事を成し遂げる必要があります。
Scalaのio
ライブラリは、限られたニーズに対するサポートを提供するためにハックされただけです。現在 assembla でホストされているScalaによく考えられたioライブラリを github リポジトリとともに提供するための努力がありました。
一時的なプロセスで時々ファイルを読み取る以外にI/Oを使用する場合は、Javaライブラリを使用するか、現在I/Oサポートを確認することをお勧めします。コンパイラーで使用可能(アプリでscala-compiler.jarを配布する必要があります)。
自動リソース管理については、 この質問 、または このライブラリ を参照してください(これは、その質問で承認された回答に記載されています)。
開始中Scala 2.13
、標準ライブラリは専用のリソース管理ユーティリティ Using
を提供します。
この場合 scala.io.Source
それが拡張されると AutoCloseable
ファイルから読み取るために、そして何があっても、後でファイルリソースを閉じるために:
import scala.util.Using
import scala.io.Source
Using(Source.fromFile("file.txt")) { source => source.mkString }
// scala.util.Try[String] = Success("hello\nworld\n")
私は singを使用 をお勧めします。
using(Source.fromFile("test.txt")){ _.mkString()}