Как правильно использовать scala.io.Source? - PullRequest
23 голосов
/ 16 декабря 2010

Во многих примерах описывается, что вы можете использовать scala.io.Source для чтения целого файла следующим образом:

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

Но закрытие основного потока не упоминается.

ПочемуРазве Scala не предоставляет удобный способ сделать это, например, с помощью предложения в Python?Это выглядит полезно, но не сложно.

Есть ли другой лучший способ сделать это безопасно в Scala, я имею в виду чтение всего файла?

Ответы [ 4 ]

23 голосов
/ 24 августа 2011

Ради полноты

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

Должны добиться цели.

22 голосов
/ 22 декабря 2010

Библиотека Scala io была взломана для поддержки ограниченных потребностей. Была предпринята попытка предоставить хорошо продуманную библиотеку io для Scala, которая в настоящее время размещается в assemblymbla , а также в хранилище github .

Если вы собираетесь использовать ввод-вывод для чего-то большего, чем чтение случайного файла в недолговечных процессах, вам лучше либо использовать библиотеки Java, либо посмотреть на поддержку ввода-вывода, которая в настоящее время доступна в компиляторе потребует, чтобы scala-compiler.jar распространялся вместе с приложением).

Что касается автоматического управления ресурсами, посмотрите на этот вопрос или эту библиотеку (которая включена в принятый ответ на этот вопрос).

6 голосов
/ 28 ноября 2015

Я рекомендую , используя , что делает ваш код более аккуратным и надежным

using(Source.fromFile("test.txt")){ _.mkString()}
2 голосов
/ 31 марта 2019

Начиная с 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")
...