Ответ 1
Для полноты
val testTxtSource = scala.io.Source.fromFile("test.txt")
val str = testTxtSource.mkString()
testTxtSource.close()
Должно получиться.
Во многих примерах описывается, что вы можете использовать scala.io.Source
для чтения целого файла следующим образом:
val str = scala.io.Source.fromFile("test.txt").mkString()
Но закрытие основного потока не упоминается.
Почему Scala не предоставляет удобный способ сделать это, например, с помощью предложения в Python? Это выглядит полезным, но не сложно.
Есть ли другой лучший способ сделать это безопасно в Scala, я имею в виду прочитать весь файл?
Для полноты
val testTxtSource = scala.io.Source.fromFile("test.txt")
val str = testTxtSource.mkString()
testTxtSource.close()
Должно получиться.
Scala io
библиотека была просто взломана, чтобы обеспечить поддержку ограниченных потребностей. Было предпринято попытку предоставить хорошо продуманную библиотеку io для Scala, которая в настоящее время размещена на assembla, с github.
Если вы собираетесь использовать ввод-вывод для чего-либо большего, чем чтение случайного файла на недолговечных процессах, вам лучше использовать библиотеки Java или посмотреть поддержку I/O, доступную в настоящее время в компиляторе (которая потребуется scala -compiler.jar для распространения с приложением).
Что касается автоматического управления ресурсами, посмотрите этот вопрос или на эту библиотеку (который указан в принятом ответе на этот вопрос).
Я рекомендую использовать использование, что делает ваш код более аккуратным и надежным
using(Source.fromFile("test.txt")){ _.mkString()}
Начиная с 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")