Read file android kotlin

Kotlin read file tutorial

last modified July 5, 2020

Kotlin read file tutorial shows how to read a file in Kotlin. We show several ways of reading a file in Kotlin.

In this tutorial, we use the File methods to read files.

The tutorial presents five examples that read a file in Kotlin.

In the examples, we use this text file.

Kotlin read file with File.readLines

File.readLines() reads the file content as a list of lines. It should not be used for large files.

The example reads a file with File.readLines() .

Kotlin read file with File.useLines

File.useLines() reads all data as a list of lines and provides it to the callback. It closes the reader in the end.

The example reads a file and prints it to the console. We add line numbers to the output.

A mutable list is created.

With File.useLines() we copy the list of the lines into the above created mutable list.

With forEachIndexed() we add a line number to each line.

Kotlin read file with File.readText

File.readText() gets the entire content of this file as a String . It is not recommended to use this method on huge files.

In the example, we read the whole file into a string and print it to the console.

Kotlin read file with InputStream

InputStream is an input stream of bytes.

The example creates an InputStream from a File and reads bytes from it. The bytes are transformed into text.

An InputStream is created from a File with inputStream() .

We read bytes from the InputStream with readBytes() and transform the bytes into text with toString() .

Kotlin read file with readBytes

The readBytes() reads the entire content of a file as a byte array. It is not recommended on huge files.

The example reads a text file into a byte array. It prints the file as numbers to the console.

In this tutorial, we have shown how to read file in Kotlin.

Источник

Kotlin Read File

Kotlin Read File – 6 Different Ways

Kotlin Read File – We can read the contents of a file in Kotlin either by using standard methods of the java.io.File class, or the methods that Kotlin provides as an extension to java.io.File.

We shall look into example programs for the extension methods, provided by Kotlin to Java‘s java.io.File Class, to read the contents of a file.

Example programs to read contents of a file in Kotlin

  • File.bufferedReader() : To read contents of a file into BufferedReader
  • File.forEachLine() : To read a file line by line in Kotlin
  • File.inputStream() : To read contents of file to InputStream
  • File.readBytes() : To read contents of file to ByteArray
  • File.readLines() : To read lines in file to List of String
  • File.readText() : To read contents of file to a single String

File.bufferedReader() : How to read contents of a file into BufferedReader

  1. Prepare file object with the location of the file passed as argument to File class constructor.
  2. File.bufferedReader returns a new BufferedReader for reading the content of the file.
  3. Use BufferedReader.readLines() to read the content of the file.

Kotlin Program – example.kt

Output

Content of file is printed to the console.

Читайте также:  Android sdk release что это

File.forEachLine() : Read a file line by line in Kotlin

  1. Prepare file object with the location passed as argument to File constructor.
  2. Use File.forEachLine function and read each line of the file.

Kotlin Program – example.kt

Output

Content of file is printed to the console.

File.inputStream() : Read contents of file to InputStream

  1. Prepare file object with the location of the file passed as argument to File class constructor.
  2. File.inputStream() returns a new InputStream for the file.
  3. Then you can read bytes from the stream and convert it to a String. This string is content of the file.

Read Content of File to InputStream and then to a String

Kotlin Program – example.kt

Content of file is printed to the console.

File.readBytes() : returns entire content of file as a ByteArray

  1. Prepare file object with the location passed as argument to File constructor.
  2. Use File.readBytes() function to get ByteArray. This byte array contains all the file contents.
  3. Use for loop to iterate over the byte array and access the contents of file byte by byte.

Kotlin Program – example.kt

Content of file is printed to the console.

File.readLines() : returns entire content of file as a List of lines

  1. Prepare file object with the location passed as argument to File constructor.
  2. Use File.readLines() function to get all the lines in the text file as List of Strings.
  3. You can access the list using for loop to read each line of the file.

Kotlin Program – example.kt

Content of file is printed to the console.

File.readText() : returns entire content of file as a single string

You can also read whole content of the file as a single string. Follow these steps.

  1. Prepare file object with the location passed as argument to File constructor.
  2. Use File.readText() function that returns entire content of file as a String.

Kotlin Program – example.kt

Content of file is printed to the console.

Conclusion

In this Kotlin Tutorial – Kotlin Read File, we have learned to read the contents of a file in Kotlin, read a file to a byte array, read a file to InputStream, read a file to list of strings, read a file line by line, read a file to BufferedReader.

Источник

7. Основы Kotlin. Файловые операции

Программы, которые мы пишем, так или иначе должны взаимодействовать с пользователем и внешней средой — операционной системой, устройствами компьютера, сетью Интернет. Простейшим способом взаимодействия является ввод с консоли и вывод на консоль, но сейчас такой способ применяется крайне редко. Более совершенным способом взаимодействия являются файлы — многие программы берут из них настроечную или входную информацию, и используют их для сохранения результатов своей работы или различных настроек. Например, всевозможные редакторы позволяют открывать файлы в определённом формате, просматривать и/или изменять их, сохранять файлы на диске компьютера или в сети Интернет.

В библиотеке Java внутри пакета java.io имеется ряд типов, обеспечивающих возможность работы с файлами, а библиотека Котлина дополняет их некоторыми удобными возможностями. Как обычно, рассмотрим часть этих возможностей на примере.

Краеугольный тип, используемый для работы с файлами в Котлине — тип java.io.File . В соответствии с названием, он предназначен для различных операций с файлами; объект этого типа соответствует какому-либо реальному файлу, чаще всего находящемуся на жёстком диске. Для создания файла используется специальная функция-конструктор: File(inputName) или File(outputName) в примере. Если в аргументе конструктора указано только имя файла — поиск файла происходит в текущей директории, а если аргумент содержим также путь к файлу — то в директории, указанной этим путём. Специфика конструктора заключается в том, что его имя совпадает с типом объекта, которую он создаёт, и он имеет результат соответствующего типа. Более подробно мы поговорим о конструкторах в следующем уроке.

Обмен данными с файлом может происходить в режиме чтения либо в режиме записи. В режиме чтения информации, заданное имя должно соответствовать уже существующему файлу. Один из способов получения информации из файла — вызов функции file.readLines() . Результат вызова — список строк, из которых состоит файл. Каждый String в этом списке соответствует одной строке файла, строки файла разделяются символом «возврат каретки» и / или «новая строка».

Читайте также:  Bold text android studio

В режиме записи информации, заданное имя может не соответствовать существующему файлу — в этом случае он будет создан. Для записи информации, необходимо создать один из объектов, обеспечивающих такую возможность. В примере, таким объектом является val writer = File(outputName).bufferedWriter() — то есть необходимо вызвать функцию bufferedWriter() на получателе, соответствующем исходному файлу. Как видно из текста примера, writer (писатель) имеет функции writer.newLine() (добавление в файл новой строки), writer.write(string) (добавление в файл заданной строки) и writer.close() (закрытие писателя, выполняется строго ПОСЛЕ выполнения всех остальных действий и фиксирует итоговое состояние файла).

Мы перечислили все файловые операции, присутствующие в исходном примере. Внутри цикла for , каждая из строк файла разбивается по пробелам на слова, с этой целью используется Regex(«\\s+») . В currentLineLength накапливается длина текущей строки ВЫХОДНОГО файла. Если в текущей строке достаточно места для очередного слова ВХОДНОГО файла, слово добавляется в текущую строку, в противном случае в файл добавляется перевод строки и слово добавляется в новую строку. Пустые строки входного файла, как и сказано в задании, переносятся в выходной файл без изменений.

Источник

Kotlin Native: следите за файлами

Когда вы пишите command line утилиту, последнее, на что вам хочется полагаться, так это на то, что на компьютере где она будет запущена установлен JVM, Ruby или Python. Так же хотелось бы на выходе иметь один бинарный файл, который будет легко запустить. И не возиться слишком много с memory management’ом.

По вышеозначенным причинам, в последние годы всегда, когда мне нужно было писать подобные утилиты, я использовал Go.

У Go относительно простой синтаксис, неплохая стандартная библиотека, есть garbage collection, и на выходе мы получаем один бинарник. Казалось бы, что еще нужно?

Не так давно Kotlin так же стал пробовать себя на схожем поприще в форме Kotlin Native. Предложение звучало многообещающе — GC, единый бинарник, знакомый и удобный синтаксис. Но все ли так хорошо, как хотелось бы?

Задача, которую нам предстоит решить: написать на Kotlin Native простой file watcher. Как аргументы утилита должна получать путь к файлу и частоту проверки. Если файл изменился, утилита дожна создать его копию в той же папке с новым именем.

Иначе говоря, алгоритм должен выглядеть следующим образом:

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

Среда

Первое, что нам потребуется — это IDE. Любителей vim попрошу не беспокоиться.

Запускаем привычный IntelliJ IDEA и обнаруживаем, что в Kotlin Native он не может от слова совсем. Нужно использовать CLion.

На этом злоключения человека, который в последний раз сталкивался с C в 2004 еще не окончены. Нужен toolchain. Если вы используете OSX, скорее всего CLion обнаружит подходящий toolchain сам. Но если вы решили использовать Windows и на C не программируете, придется повозиться с tutorial’ом по установке какого-нибудь Cygwin.

IDE установили, с toolchain’ом разобрались. Можно уже начать код писать? Почти.
Поскольку Kotlin Native еще несколько экспериментален, плагин для него в CLion не установлен по умолчанию. Так что прежде, чем мы увидим заветную надпись «New Kotlin/Native Application» придется его установить вручную.

Немного настроек

И так, наконец-то у нас есть пустой Kotlin Native проект. Что интересно, он основан на Gradle (а не на Makefile’ах), да еще на Kotlin Script версии.

Заглянем в build.gradle.kts :

Единственный плагин, который мы будем использовать называется Konan. Он то и будет производить наш бинарный файл.

В konanArtifacts мы указываем имя исполняемого файла. В данном примере получится file_watcher.kexe

Пора бы уже и код показать. Вот он, кстати:

Обычно у command line утилиты бывают так же опциональные аргументы и их значения по умолчанию. Но для примера будем предполагать, что аргумента всегда два: path и interval

Для тех, кто с Kotlin уже работал можем показаться странным, что path оборачивается в свой собственный класс File , без использования java.io.File . Объяснение этому — черезе минуту-другую.

Читайте также:  Top one android mobile

Если вы вдруг не знакомы с функцией require() в Kotlin — это просто более удобный способ для валидации аргументов. Kotlin — он вообще про удобство. Можно было бы написать и так:

В целом, тут пока обычный Kotlin код, ничего интересного. А вот с этого момента станет повеселей.

Давайте будем пытаться писать обычный Kotlin-код, но каждый раз, когда нам нужно использовать что-нибудь из Java, мы говорим «упс!». Готовы?

Вернемся к нашему while , и пусть он отпечатывает каждый interval какой-нибудь символ, к примеру точку.

Thread — это класс из Java. Мы не можем использовать Java классы в Kotlin Native. Только Kotlin’овские классы. Никакой Java.

Кстати, потому в main мы и не использовали java.io.File

Хорошо, а что тогда можно использовать? Функции из C!

Добро пожаловать в мир C

Теперь, когда мы знаем что нас ждет, давайте посмотрим как выглядит функция exists() из нашего File :

File это простой data class , что дает нам имплементацию toString() из коробки, которой мы потом воспользуемся.

«Под капотом» мы вызываем C функцию access() , которая возвращает -1 , если такого файла не существует.

Дальше по списку у нас функция modified() :

Функцию можно было бы немного упростить используя type inference, но тут я решил этого не делать, чтобы было понятно, что функция не возвращает, к примеру, Boolean .

В этой фукнции есть две интересные детали. Во-первых, мы используем alloc() . Поскольку мы используем C, иногда нужно выделять структуры, а делается это в C вручную, при помощи malloc().

Высвобождать эти структуры тоже нужно вручную. Тут на помощь приходит функция memScoped() из Kotlin Native, которая это сделает за нас.

Нам осталось рассмотреть наиболее увесистую функцию: сopyAside()

Тут мы используем С функцию copyfile_state_alloc() , которая выделяет нужную для copyfile() структуру.

Но и высвобождать нам эту структуру приходится самим — используя
copyfile_state_free(state)

Последнее, что осталось показать — это генерация имен. Тут просто немного Kotlin:

Это довольно наивный код, который игнорирует многие кейсы, но для примера сойдет.

Теперь как все это запускать?

Один вариант — это конечно использовать CLion. Он все сделает за нас.

Но давайте вместо этого используем command line, чтобы лучше понять процесс. Да и какой-нибудь CI не будет запускать наш код из CLion.

Первым делом мы компилируем наш проект используя Gradle. Если все прошло успешно, появится следующее сообщение:

Шестнадцать секунд?! Да, в сравнение с каким-нибудь Go или даже Kotlin для JVM, результат неутешителен. И это еще крошечный проект.

Теперь вы должны увидеть бегущие по экрану точки. И если вы измените содержимое файла, об этом появится сообщение. Что-то вроде такой картины:

Время запуска замерить сложно. Зато мы можем проверить, сколько памяти занимает наш процесс, используя к примеру Activity Monitor: 852KB. Неплохо!

Немного выводов

И так, мы выяснили что при помощи Kotlin Native мы можем получить единый исполняемый файл с memory footprint’ом меньше, чем у того же Go. Победа? Не совсем.

Как это все тестировать? Те кто работал с Go или Kotlin’ом знаю, что в обоих языках есть хорошие решения для этой важной задачи. У Kotlin Native с этим пока что все плохо.

Вроде бы в 2017ом JetBrains пытались это решить. Но учитывая, что даже у официальных примеров Kotlin Native нет тестов, видимо пока не слишком успешно.

Другая проблема — crossplatform разработка. Те, кто работали с C побольше моего уже наверняка заметили, что мой пример будет работать на OSX, но не на Windows, поскольку я полагаюсь на несколько функций доступных только с platform.darwin . Надеюсь что в будущем у Kotlin Native появится больше оберток, которые позволят абстрагироваться от платформы, к примеру при работе с файловой системой.

Все примеры кода вы можете найти тут

И ссылка на мою оригинальную статью, если вы предпочитаете читать на английском

Источник

Оцените статью