web-dev-qa-db-ja.com

scala.io.Sourceを使用する正しい方法は何ですか?

多くの例では、scala.io.Sourceを使用して次のようにファイル全体を読み取ることができると説明されています。

val str = scala.io.Source.fromFile("test.txt").mkString()

ただし、基になるストリームを閉じることについては触れられていません。

ScalaがPythonのwith句などの便利な方法を提供しないのはなぜですか?便利そうに見えますが、難しくはありません。

Scalaで安全にこれを行う他のより良い方法はありますか?私はファイル全体を読み取ることを意味しますか?

31
woods

完全を期すために

val testTxtSource = scala.io.Source.fromFile("test.txt")
val str = testTxtSource.mkString()
testTxtSource.close()

物事を成し遂げる必要があります。

26
matyjas

Scalaのioライブラリは、限られたニーズに対するサポートを提供するためにハックされただけです。現在 assembla でホストされているScalaによく考えられたioライブラリを github リポジトリとともに提供するための努力がありました。

一時的なプロセスで時々ファイルを読み取る以外にI/Oを使用する場合は、Javaライブラリを使用するか、現在I/Oサポートを確認することをお勧めします。コンパイラーで使用可能(アプリでscala-compiler.jarを配布する必要があります)。

自動リソース管理については、 この質問 、または このライブラリ を参照してください(これは、その質問で承認された回答に記載されています)。

22

開始中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")
10
Xavier Guihot

私は singを使用 をお勧めします。

using(Source.fromFile("test.txt")){ _.mkString()}
6