Много доступных инструментов дают информацию процента заполненных строк и так далее.
Вы просто должны посмотреть на него, но не только рассчитываете на него.
LOC растет в широком масштабе на запуске проекта, и он уменьшается часто после обзоров ;)
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"
Просто чтобы расширить решение Дэниела, вы можете значительно сократить его, вставив следующий импорт в любой файл, требующий манипуляции с файлом:
import scala.io.Source._
Теперь вы можете:
val lines = fromFile("file.txt").getLines
Я бы не стал читать весь файл в одну String
. Это очень плохая привычка, которая укусит вас раньше и сильнее, чем вы думаете. Метод getLines
возвращает значение типа Iterator [String]
. По сути, это ленивый курсор в файл, позволяющий исследовать только те данные, которые вам нужны, без риска перенасыщения памяти.
Да, и чтобы ответить на ваш подразумеваемый вопрос о Source
: да, это канонический I / O библиотека. Большая часть кода заканчивается использованием java.
// for file with utf-8 encoding
val lines = scala.io.Source.fromFile("file.txt", "utf-8").getLines.mkString
Очевидный вопрос «почему вы хотите читать весь файл?» Очевидно, что это не масштабируемое решение, если ваши файлы становятся очень большими. scala.io.Source
возвращает вам Iterator [String]
из метода getLines
, который очень полезен и краток.
Это немного. задания по созданию неявного преобразования с использованием базовых утилит ввода-вывода Java для преобразования файла
, Reader
или InputStream
в String
. Я думаю, что отсутствие масштабируемости означает, что они правы, чтобы не добавлять это в стандартный API.
Мне сказали, что Source.fromFile проблематичен. Лично у меня были проблемы с открытием больших файлов с помощью Source.fromFile, и мне приходилось прибегать к Java InputStreams.
Еще одно интересное решение - использование скалакса. Вот пример хорошо прокомментированного кода, который открывает файл журнала с помощью ManagedResource для открытия файла с помощью помощников скалякс: http://pastie.org/pastes/420714
(РЕДАКТИРОВАТЬ: это не работает в scala 2.9 и, возможно, не в 2.8)
Используйте магистраль:
scala> io.File("/etc/passwd").slurp
res0: String =
##
# User Database
#
... etc
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) не объединится.