Чтение из файла в Котлине

Чтение из файла в Котлине

1. обзор

В этом кратком руководстве мы узнаем о различных способах чтения файла в Kotlin.

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

2. Чтение файла

Давайте сначала создадим входной файл, который будет читать Котлин. Мы создаем файл с именемKotlin.in и помещаем его в каталог, доступный для нашего кода.

Содержимое файла может быть:

Hello to Kotlin. It's:
1. Concise
2. Safe
3. Interoperable
4. Tool-friendly

Теперь давайте рассмотрим различные способы чтения этого файла. Мы должны передать полный путь к созданному выше файлу в качестве входных данных для начальных методов и относительный путь в наших ресурсах для последних двух.

2.1. forEachLineс

Reads a file line by line с использованием указанногоcharset (по умолчанию UTF-8) и вызывает действие для каждой строки:

fun readFileLineByLineUsingForEachLine(fileName: String)
  = File(fileName).forEachLine { println(it) }

2.2. useLinesс

Вызывает обратный вызов заданного блока, передавая ему последовательность всех строк в файле.

По завершении обработки файл закрывается:

fun readFileAsLinesUsingUseLines(fileName: String): List
  = File(fileName).useLines { it.toList() }

2.3. bufferedReaderс

Возвращает новыйBufferedReader для чтения содержимого файла.

Когда у нас естьBufferedReader, мы можем прочитать все строки в нем:

fun readFileAsLinesUsingBufferedReader(fileName: String): List
  = File(fileName).bufferedReader().readLines()

2.4. readLinesс

Непосредственно читает содержимое файла в виде списка строк:

fun readFileAsLinesUsingReadLines(fileName: String): List
  = File(fileName).readLines()

Этот метод не рекомендуется использовать для больших файлов.

2.5. inputStreamс

Создает новыйFileInputStream для файла и в результате возвращает его.

Получив входной поток, мы можем преобразовать его в байты, а затем в полныйString:

fun readFileAsTextUsingInputStream(fileName: String)
  = File(fileName).inputStream().readBytes().toString(Charsets.UTF_8)

2.6. readTextс

Reads the entire content of the file as a String указанныйcharset (по умолчанию UTF-8):

fun readFileDirectlyAsText(fileName: String): String
  = File(fileName).readText(Charsets.UTF_8)

Этот метод не рекомендуется для больших файлов и имеет внутреннее ограничение на размер файла 2 ГБ.

2.7. getResourceс

Находит ресурс с заданным именем и возвращает объектURL:

fun readFileUsingGetResource(fileName: String)
  = this::class.java.getResource(fileName).readText(Charsets.UTF_8)

Если он найдет ресурс, он вернетURL, который можно обработать, вызвав методreadText, как показано ранее. Если он не может найти ресурс, он возвращаетnull. При использованииgetResource переданный вfileName не является абсолютным именем файла, а является именем относительно ресурсов нашего проекта.

2.8. getResourceAsStreamс

Находит ресурс с заданным именем и возвращает экземплярInputStream:

fun readFileAsLinesUsingGetResourceAsStream(fileName: String)
  = this::class.java.getResourceAsStream(fileName).bufferedReader().readLines()

Если он найдет ресурс, он вернетInputStream, который можно обработать, как показано ранее, например, получивBufferedReader. Если он не может найти ресурс, он возвращаетnull. При использованииgetResourceAsStream вfileName передается не абсолютное имя файла, а имя относительно ресурсов нашего проекта.

3. Заключение

В этой статье мы увидели различные способы чтения файла в Kotlin. В зависимости от варианта использования мы можем выбрать чтение файла построчно или чтение полностью как текста. Мы можем обратиться к файлу в абсолютной манере или найти его среди ресурсов.

Исходный код этой статьи можно найти в следующихGitHub repo.