Считать весь файл в Scala?

  1. LOCphy: физически строки
  2. LOCbl: Blanklines Kommentarblocks werden Альс Kommentarzeile gezГ¤hlt
  3. LOCpro: строки программирования (объявления, определения, директивы & код)
  4. LOCcom: строки комментариев

Много доступных инструментов дают информацию процента заполненных строк и так далее.

Вы просто должны посмотреть на него, но не только рассчитываете на него.

LOC растет в широком масштабе на запуске проекта, и он уменьшается часто после обзоров ;)

302
задан Community 23 May 2017 в 02:18
поделиться

7 ответов

val lines = scala.io.Source.fromFile("file.txt").mkString

Кстати, " scala. " на самом деле не нужен, так как он всегда в области видимости, и вы можете , конечно, импортируйте содержимое io, полностью или частично, и избегайте добавления "io". тоже.

Однако вышеизложенное оставляет файл открытым. Чтобы избежать проблем, вы должны закрыть его следующим образом:

val source = scala.io.Source.fromFile("file.txt")
val lines = try source.mkString finally source.close()

Другая проблема с приведенным выше кодом заключается в том, что он ужасно медленный из-за характера реализации. Для файлов большего размера следует использовать:

source.getLines mkString "\n"
420
ответ дан 23 November 2019 в 01:25
поделиться

Просто чтобы расширить решение Дэниела, вы можете значительно сократить его, вставив следующий импорт в любой файл, требующий манипуляции с файлом:

import scala.io.Source._

Теперь вы можете:

val lines = fromFile("file.txt").getLines

Я бы не стал читать весь файл в одну String . Это очень плохая привычка, которая укусит вас раньше и сильнее, чем вы думаете. Метод getLines возвращает значение типа Iterator [String] . По сути, это ленивый курсор в файл, позволяющий исследовать только те данные, которые вам нужны, без риска перенасыщения памяти.

Да, и чтобы ответить на ваш подразумеваемый вопрос о Source : да, это канонический I / O библиотека. Большая часть кода заканчивается использованием java.

56
ответ дан 23 November 2019 в 01:25
поделиться
// for file with utf-8 encoding
val lines = scala.io.Source.fromFile("file.txt", "utf-8").getLines.mkString
36
ответ дан 23 November 2019 в 01:25
поделиться

Очевидный вопрос «почему вы хотите читать весь файл?» Очевидно, что это не масштабируемое решение, если ваши файлы становятся очень большими. scala.io.Source возвращает вам Iterator [String] из метода getLines , который очень полезен и краток.

Это немного. задания по созданию неявного преобразования с использованием базовых утилит ввода-вывода Java для преобразования файла , Reader или InputStream в String . Я думаю, что отсутствие масштабируемости означает, что они правы, чтобы не добавлять это в стандартный API.

2
ответ дан 23 November 2019 в 01:25
поделиться

Мне сказали, что Source.fromFile проблематичен. Лично у меня были проблемы с открытием больших файлов с помощью Source.fromFile, и мне приходилось прибегать к Java InputStreams.

Еще одно интересное решение - использование скалакса. Вот пример хорошо прокомментированного кода, который открывает файл журнала с помощью ManagedResource для открытия файла с помощью помощников скалякс: http://pastie.org/pastes/420714

7
ответ дан 23 November 2019 в 01:25
поделиться

(РЕДАКТИРОВАТЬ: это не работает в scala 2.9 и, возможно, не в 2.8)

Используйте магистраль:

scala> io.File("/etc/passwd").slurp
res0: String = 
##
# User Database
# 
... etc
26
ответ дан 23 November 2019 в 01:25
поделиться
package foo;
public class Globals {
  public static int count = 3;
}

Тогда вы можете получить доступ к нему в любом месте как

int uses_global = foo. Globals.count + 1;

-121--2739191-

Java предназначена для создания полностью переносимых, полностью многократно используемых объектов.

По определению, то, что зависит от «глобальной переменной», не является полностью переносимым или полностью повторно используемым. Это зависит от глобальной переменной, существующей в новой (многократно используемой) системе, и от кода в новой (многократно используемой) системе, манипулирующей этой глобальной переменной. В этот пункт лучше поместить эту глобальную переменную в собственный объект.

-121--2739192-

, поскольку несколько человек упомянули scala.io.Source лучше всего избегать из-за утечек соединения.

Вероятно, scalax и чистые java libs, такие как commons-io являются лучшими вариантами, пока новый проект инкубатора (то есть scala-io) не объединится.

3
ответ дан 23 November 2019 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: