Подтвердить что ты не робот

Как правильно использовать scala.io.Source?

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

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

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

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

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

4b9b3361

Ответ 1

Для полноты

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

Должно получиться.

Ответ 2

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

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

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

Ответ 4

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