Kotlin прочитать строку из файла
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.
5 Answers 5
You need to use internal or external storage directory for your file.
If you want to use external storage you'll need to add a permission to the manifest:
Create your directory:
Then create your file:
Then you can write to it:
I think you have to use a call to .mkdirs() in there somewhere in the case where "/LET" may not yet exist. Also, for writing, he can just use file.appendText (which eventually resolves to something similar to what you've written, except that appendText sets the character set to UTF8)
If you are inside an activity you can just call getFilesDir() , otherwise you will need to get a context object. In a fragment you can call getContext().getFilesDir() .
I managed to get internal storage path using Environment. getExternalStorageDirectory().getPath() And assigned file using File(filePath//which is the internal storage path , "/LET/HelloWorld.txt") But I cannot write to it. App crashes. I tried writeText and appendText. I cannot find how to create the file. When I check the storage, no folder or file has been created, and the app crashes on both.
None of the documentation explains why you need context, or where that's supposed to come from. Are there certain places where we're supposed to access (or not access) internal storage? It seems like one ought to be able to write to that directory whenever
Kotlin has made file reading/writing quite simple.
For reading/writing to internal storage:
For reading/writing to external storage:
Thank you so much! Finally a great to-the-point Kotlin answer on reading and writing to .txt file. Thanks again :)
I just want to add on to TpoM6oH's answer. When working with Files, you may be not guaranteed with 100% success on the file operations you intend. So, it is a better practice to try and catch for exceptions like filenotfoundexception etc. and take a due care about the flow of program control.
To create a file at the external storage in Android, you can get the location using
and check if the location exists. If it does not, create one and continue creating and writing your file using Kotlin
Hope this helps.
How to write a list of files? Can we put the above code in for loop and execute till the number of files to be written?
I want to write a Spek test in Kotlin. The test should read an HTML file from the src/test/resources folder. How to do it?
15.2 Терминал ввода-вывода
Длинный оператор вывода Java System.out.println () продолжается до настоящего времени! Та же самая работа может быть сделана в C ++ с простым cout
В Kotlin все очень просто. Вам нужно использовать только две глобальные функции println или print. Нам не нужны длинные префиксы. Конечно, если мы очень ностальгируем, мы просто хотим использовать System.out.println (), Kotlin все еще поддерживает это напрямую (бесшовная совместимость с Java).
Функция println Kotlin реализована следующим образом
Конечно, Kotlin только инкапсулирует System.out.println ().
Чтение данных из терминала также очень просто: самый основной метод - глобальная функция readLine, которая читает строку непосредственно из терминала в виде строки. Если вам нужна дополнительная обработка, вы можете использовать различные функции обработки строк, предоставляемые Kotlin, для обработки и преобразования строк.
Класс Kotlin, который инкапсулирует терминальный ввод-вывод, находится в исходном файле stdlib / src / kotlin / io / Console.kt.
15.5 Операции сетевого ввода-вывода
Ниже мы просто напишем несколько примеров функций.
Получить ответ URL в соответствии с HTML-функцией URL
Получить функцию массива битов ответа URL в соответствии с URL
Записать байтовый массив ответа URL в файл
Следующий пример просто возвращает исходный код домашней страницы Baidu.
В следующем примере выполняется получение потока битов изображения на основе URL-адреса, а затем вызывается метод readBytes () для чтения потока байтов и записи его в файл.
Мы можем увидеть скачанный файл «picture.jpg» в соответствующей папке проекта.
9.5.2. Методы и блоки синхронизации
синхронизированный - это не ключевое слово в Kotlin, оно заменяется аннотацией @Synchronized. Объявление синхронного метода в Kotlin будет выглядеть так:
Аннотация @Synchronized имеет тот же эффект, что и синхронизация в Java: она помечает методы JVM как синхронизированные. Для синхронизированных блоков мы используем функцию synchronized (), которая принимает блокировку в качестве параметра:
В основном так же, как Java.
Example programs to read contents of a file in Kotlin
-
: To read contents of a file into BufferedReader : To read a file line by line in Kotlin : To read contents of file to InputStream : To read contents of file to ByteArray : To read lines in file to List of String : To read contents of file to a single String
Краткое содержание этой главы
Kotlin - очень практичный инженерный язык: из файлового ввода-вывода, регулярных выражений и многопоточности, представленных в этой главе, мы можем понять основные принципы Kotlin: в полной мере использовать существующую экологическую библиотеку Java и опираться на На нем есть более простые и практичные расширения, которые значительно повышают производительность труда программистов. Из этого мы также поняли минималистскую концепцию программирования Kotlin - постоянно абстрагируя, инкапсулируя и расширяя, делая ее более простой и практичной
В следующей главе и в нашей последней главе давайте оторвемся от JVM и напрямую будем использовать Kotlin Native для разработки приложения Kotlin, которое компилируется непосредственно в машинный код и запускается.
15.9.1 Создание темы
У нас обычно есть два метода в Java для создания потоков в Java:
- Расширение класса Thread
- Или создайте его экземпляр и передайте Runnable через конструктор
Поскольку мы легко можем использовать классы Java в Kotlin, можно использовать оба метода.
Создание с использованием выражений объекта
Этот код использует объектное выражение Kotlin для создания анонимного класса и переопределяет метод run ().
Использование лямбда-выражений
Вот как передать Runnable во вновь созданный экземпляр Thread:
Мы не видим здесь Runnable. В Kotlin мы можем легко использовать вышеприведенное лямбда-выражение для его выражения.
Есть ли более простой способ? Посмотрите на объяснение ниже.
Использование Kotlin-обернутых потоковых функций
Например, мы написали следующий код потока
Следующие четыре строки можно назвать стандартным кодом. Инкапсуляция таких операций упрощена в Kotlin.
Этот код выглядит более упорядоченным и аккуратным. Фактически функция thread () является абстрактной инкапсуляцией стандартного кода, часто используемого в нашей практике программирования.
Это просто очень удобная функция обертки, простая и практичная. Из приведенного выше примера мы видим, что Kotlin упростил шаблонный код, расширив API-интерфейс потоков Java.
Краткое содержание этой главы
Kotlin - очень практичный инженерный язык: из файлового ввода-вывода, регулярных выражений и многопоточности, представленных в этой главе, мы можем понять основные принципы Kotlin: в полной мере использовать существующую экологическую библиотеку Java и опираться на На нем есть более простые и практичные расширения, которые значительно повышают производительность труда программистов. Из этого мы также поняли минималистскую концепцию программирования Kotlin - постоянно абстрагируя, инкапсулируя и расширяя, делая ее более простой и практичной
Глава 9. Операции ввода-вывода файлов, регулярные выражения и многопоточность
Мы уже ввели характеристики расширений классов в Kotlin в главе 6 «Функции и свойства расширений». Используя расширенную функцию Kotlin, мы можем напрямую реализовать функцию inc () для класса String, которая добавляет 1 к каждому символьному значению в строке.
Эта функция расширения реализована следующим образом
Благодаря мощным функциям расширения мы можем расширить множество «на первый взгляд нативных методов в классах Java» на основе библиотеки классов Java. Фактически, большое количество API в стандартной библиотеке Kotlin kotlin-stdlib реализовано путем расширения классов Java.
Операции файлового ввода-вывода, регулярные выражения и многопоточность, которые мы представим в этой главе, реализованы Kotlin путем расширения существующих классов Java. Сначала давайте введем чтение и запись файлов.
15.9 Котлин Многопоточность
В Kotlin нет синхронизированного ключевого слова.
В Kotlin отсутствует ключевое слово volatile.
Любой из Kotlin похож на Java-объект, но без методов wait (), notify () и notifyAll ().
Так как же работает параллелизм в Котлине? Будьте уверены, поскольку Kotlin стоит на плечах Java, конечно, поддержка многопоточного программирования неизбежна - Kotlin упрощает наше кодирование, инкапсулируя классы потоков в Java. В то же время мы также можем использовать некоторые конкретные аннотации и напрямую использовать ключевые слова синхронизации в Java. Давайте кратко представим соответствующий контент многопоточного программирования с Kotlin.
15.8.2 Функция регулярного выражения
Regex предоставляет множество простых и практичных функций, как показано в следующей таблице
Имя функции | Описание функции |
---|---|
matches(input: CharSequence): Boolean | Все входные строки совпадают |
containsMatchIn(input: CharSequence): Boolean | У входной строки есть хотя бы одно совпадение |
matchEntire(input: CharSequence): MatchResult? | Все входные строки совпадают, возвращают соответствующий объект результата |
replace(input: CharSequence, replacement: String): String | Заменить совпадающую часть входной строки содержимым замены |
replace(input: CharSequence, transform: (MatchResult) -> CharSequence): String | Замените совпадающее значение во входной строке новым значением после преобразования преобразования функции |
find(input: CharSequence, startIndex: Int = 0): MatchResult? | Возвращает первое совпадающее значение во входной строке |
findAll(input: CharSequence, startIndex: Int = 0): Sequence | Возвращает последовательность всех совпадающих значений во входной строке |
Ниже мы приведем простые примеры вышеуказанных функций соответственно.
matches
Все входные строки соответствуют регулярному выражению и возвращают true, в противном случае возвращается false.
containsMatchIn
Возвращает true, если во входной строке есть хотя бы одно совпадение, и false, если совпадения нет.
matchEntire
Все входные строки соответствуют регулярному выражению и возвращают объект MatcherMatchResult, в противном случае он возвращает ноль.
Мы можем получить доступ к значению MatcherMatchResult, чтобы получить соответствующее значение.
Поскольку возвращением функции matchEntire является объект MatchResult? Nullable, здесь мы используем символ безопасного вызова ?. 。
replace(input: CharSequence, replacement: String): String
Замените соответствующую часть входной строки содержимым замены.
Мы можем видеть это в "12345XYZ" 12345 Соответствует регулярному выражению 6+ Содержание было заменено abcd 。
replace(input: CharSequence, transform: (MatchResult) -> CharSequence): String
Замените совпадающее значение во входной строке новым значением после преобразования преобразования.
Мы можем видеть, что 9XYZ8 Числа 9 и 8 соответствуют регулярным выражениям 6+ Содержимое, они соответственно отображаются с помощью функции преобразования (it.value.toInt() * it.value.toInt()).toString() Замените новые значения 81 и 64.
Возвращает первый соответствующий объект MatcherMatchResult во входной строке.
findAll
Возвращает последовательность MatchResults для всех совпадающих значений во входной строке.
Мы можем перебрать все совпадающие значения через цикл forEach
15.4. Обход файлового дерева
Как и Groovy, Kotlin также предоставляет удобные функции для обхода дерева файлов. Обход дерева файлов требует вызова метода расширения walk (). Он вернет объект FileTreeWalk, и у него есть несколько методов для установки направления и глубины обхода, подробности см. В документации по FileTreeWalk API.
В следующем примере выполняется перебор всех файлов в указанной папке.
Запустите приведенный выше тестовый код, он выведет все подкаталоги и их файлы в текущем каталоге.
Мы также можем перебрать все файлы подкаталогов ниже текущего файла и сохранить его в Итераторе
Мы перебираем все файлы подкаталогов в текущем файле, а также можем фильтровать по условиям и сохранять результаты в Sequence
Запустите приведенный выше тестовый код в проекте, и он будет иметь следующий результат:
File.readLines() : returns entire content of file as a List of lines
- Prepare file object with the location passed as argument to File constructor.
- Use File.readLines() function to get all the lines in the text file as List of Strings.
- 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.
9.1.1 Чтение файлов
readText: получить всю строку содержимого файла
Если мы просто читаем файл, мы можем использовать метод readText (), который напрямую возвращает все содержимое файла. Пример кода выглядит следующим образом
Мы напрямую используем объект File для вызова функции readText, чтобы получить все содержимое файла, которое возвращает строку. Если вы указываете кодировку символов, вы можете указать ее, передав параметр Charset.
readLines: получить содержимое каждой строки файла
Если мы хотим получить содержимое каждой строки файла, мы можем просто использовать split ("\ n"), чтобы получить массив каждой строки. Мы также можем напрямую вызвать инкапсулированную функцию readLines Kotlin, чтобы получить содержимое каждой строки файла. Функция readLines возвращает список строк, содержащих содержимое каждой строки.
readBytes: читать массив байтов
Если мы хотим напрямую манипулировать байтовым массивом файла, мы можем использовать функцию readBytes
bufferedReader
Получить BufferedReader для файла
9.5.1 Создать тему
У нас обычно есть два метода в Java для создания потоков в Java:
- Расширение класса Thread
- Или создайте его экземпляр и передайте Runnable через конструктор
Поскольку мы легко можем использовать классы Java в Kotlin, можно использовать оба метода.
Создание с использованием выражений объекта
Этот код использует объектное выражение Kotlin для создания анонимного класса и переопределяет метод run ().
Использование лямбда-выражений
Вот как передать Runnable во вновь созданный экземпляр Thread:
Мы не видим здесь Runnable. В Kotlin мы можем легко использовать вышеприведенное лямбда-выражение для его выражения.
Есть ли более простой способ? Посмотрите на объяснение ниже.
Использование Kotlin-обернутых потоковых функций
Например, мы написали следующий код потока
Следующие четыре строки можно назвать стандартным кодом. Инкапсуляция таких операций упрощена в Kotlin.
Этот код выглядит более упорядоченным и аккуратным. Фактически функция thread () является абстрактной инкапсуляцией стандартного кода, часто используемого в нашей практике программирования.
Это просто очень удобная функция обертки, простая и практичная. Из приведенного выше примера мы видим, что Kotlin упростил шаблонный код, расширив API-интерфейс потоков Java.
15.3.2 Запись файлов
Подобно чтению файла, запись в файл проста. Мы можем написать строки или байтовые потоки. Вы также можете использовать Java Writer или OutputStream напрямую.
Перезаписать файл
Добавить файл в конце
12 Answers 12
For me this didn't work, I had to change it to this::class.java.classLoader.getResource("/html/file.html").readText()
For me both these options worked in an Android app (notice the extra / in one of them, which has to be removed in the other): this::class.java.getResource("/html/file.html").readText() and this::class.java.classLoader.getResource("html/file.html").readText()
Oddly enough I always need a leading slash. E.g if the file is in the resources root directory, you still have to refer to it as "/file.html"
No idea why this is so hard, but the simplest way I've found (without having to refer to a particular class) is:
It returns null if no resource with this name is found (as documented).
And then passing in an absolute URL, e.g.
One downside with the method above is it creates a new object for every resource access. Would be better to store the dummy object outside the function.
@RussellBriggs tbh I don't think that matters much. The performance of an object creation is not really an issue if you do disk access!
another slightly different solution:
Nice usage of an extension function! But why do you use a lambda function here? That does not make much sense to me. Furthermore, the this part did not work for me. Thus I recommend the following: fun String.asResource(): URL? = object <>.javaClass.getResource(this)
I like this method of working on it where you declare the file, then work on the contents of that file. Personal preference I guess. this in the example above refers to the string object.
it is in this context. i wouldn't make this globally available or use it outside of test classes. I consider it more of a mapping function here.
@Ben Use of extension functions and extension properties is by definition an abuse, since it pretends to add members to a class it doesn't have internal access to. If you don't like it, don't use it. Some of us are focused on making our code more straightforward rather than worrying about OO purity.
9.1.2 Запись файлов
Используя расширенные функции Kotlin, запись в файл также довольно проста. Это похоже на чтение файла. Мы можем записать строку или поток байтов. Мы также можем напрямую вызвать класс Java Writer или OutputStream. Запись файлов обычно делится на два типа: перезапись (однократная запись) и добавление записи.
writeText: перезаписать файл записи
Мы используем функцию writeText для записи содержимого строкового текста непосредственно в файл
Где параметр destFile - это имя целевого файла (с каталогом).
appendFile: добавить запись файла в конце
Добавить запись в конец файла, используя текст функции appendFile
appendBytes
Добавить байтовый массив в файл
bufferedWriter
Получите BufferedWriter для файла
15.8.1. Построение выражения регулярного выражения
Используйте конструктор Regex
Параметр сопоставления RegexOption является обычным параметром сопоставления в шаблоне класса Java, который используется напрямую.
Функция расширения ToRegex с использованием String
9.4.2 Функция регулярного выражения
Regex предоставляет множество простых и практичных функций, как показано в следующей таблице
Имя функции | Описание функции |
---|---|
matches(input: CharSequence): Boolean | Все входные строки совпадают |
containsMatchIn(input: CharSequence): Boolean | У входной строки есть хотя бы одно совпадение |
matchEntire(input: CharSequence): MatchResult? | Все входные строки совпадают, возвращают соответствующий объект результата |
replace(input: CharSequence, replacement: String): String | Заменить совпадающую часть входной строки содержимым замены |
replace(input: CharSequence, transform: (MatchResult) -> CharSequence): String | Замените совпадающее значение во входной строке новым значением после преобразования преобразования функции |
find(input: CharSequence, startIndex: Int = 0): MatchResult? | Возвращает первое совпадающее значение во входной строке |
findAll(input: CharSequence, startIndex: Int = 0): Sequence | Возвращает последовательность всех совпадающих значений во входной строке |
Ниже мы приведем простые примеры вышеуказанных функций соответственно.
matches
Все входные строки соответствуют регулярному выражению и возвращают true, в противном случае возвращается false.
containsMatchIn
Возвращает true, если во входной строке есть хотя бы одно совпадение, и false, если совпадения нет.
matchEntire
Все входные строки соответствуют регулярному выражению и возвращают объект MatcherMatchResult, в противном случае он возвращает ноль.
Мы можем получить доступ к значению MatcherMatchResult, чтобы получить соответствующее значение.
Поскольку возвращением функции matchEntire является объект MatchResult? Nullable, здесь мы используем символ безопасного вызова ?. 。
replace(input: CharSequence, replacement: String): String
Замените соответствующую часть входной строки содержимым замены.
Мы можем видеть это в "12345XYZ" 12345 Соответствует регулярному выражению 4+ Содержание было заменено abcd 。
replace функция
Функция замены подписи выглядит следующим образом
Его функция заключается в замене сопоставленного значения во входной строке новым значением после преобразования преобразования функции.
Мы можем видеть, что 9XYZ8 Числа 9 и 8 соответствуют регулярным выражениям 6+ Содержимое, они соответственно отображаются с помощью функции преобразования (it.value.toInt() * it.value.toInt()).toString() Замените новые значения 81 и 64.
find функция
Возвращает первый соответствующий объект MatcherMatchResult во входной строке.
findAll
Возвращает последовательность MatchResults для всех совпадающих значений во входной строке.
Мы можем перебрать все совпадающие значения через цикл forEach
9.2 Сетевой ввод-вывод
Ниже мы просто напишем несколько примеров функций.
Получить ответ URL в соответствии с HTML-функцией URL
Получить функцию массива битов ответа URL в соответствии с URL
Записать байтовый массив ответа URL в файл
Следующий пример просто возвращает исходный код домашней страницы Baidu.
В следующем примере выполняется получение потока битов изображения на основе URL-адреса, а затем вызывается метод readBytes () для чтения потока байтов и записи его в файл.
Мы можем увидеть скачанный файл «picture.jpg» в соответствующей папке проекта.
15.6 kotlin.io Стандартная библиотека
Библиотека io Kotlin - это, прежде всего, библиотека io, которая расширяет Java. Ниже мы кратко приведем несколько примеров.
appendBytes
Добавить байтовый массив в файл
appendText
Добавить текст в файл
bufferedReader
Получить BufferedReader для файла
bufferedWriter
Получите BufferedWriter для файла
copyRecursively
Скопируйте файл или рекурсивно скопируйте каталог и все его вложенные файлы по указанному пути. Если файл по указанному пути не существует, он будет создан автоматически.
15.8 Регулярные выражения
В Kotlin, в дополнение к прежнему использованию Java Pattern, Matcher и других классов, Kotlin также предоставляет класс регулярного выражения kotlin / text / regex / Regex.kt. Мы используем конструктор Regex для создания регулярного выражения ,
9.4.3. Классы регулярных выражений с использованием Java
В дополнение к функциям, предоставляемым Kotlin выше, мы все еще можем использовать API регулярных выражений Java в Kotlin.
Приведенный выше код запускает вывод:
15.1 Введение в Kotlin IO
Все операции ввода-вывода Kotlin выполняются в пакете kotlin.io. Принцип Kotlin заключается в том, что в Java он уже есть. Если его легко использовать, используйте его напрямую. Если он плохой или нет, используйте оригинальный класс для его расширения. Например, Kotlin написал функции расширения для класса File. Это та же идея, что и в расширенном API Groovy.
15.3 Операции ввода-вывода файла
Kotlin предоставляет множество полезных функций расширения для java.io.File. Эти функции расширения в основном находятся в следующих трех исходных файлах:
kotlin/io/files/FileTreeWalk.kt |
---|
kotlin/io/files/Utils.kt |
kotlin/io/FileReadWrite.kt |
В то же время, Kotlin также сделал простые расширения для InputStream, OutputStream и Reader. В основном они находятся в следующих двух исходных файлах:
kotlin/io/IOStreams.kt |
---|
kotlin/io/ReadWrite.kt |
Сериализация Колтина напрямую использует псевдоним типа класса сериализации Java:
Давайте кратко представим операции чтения и записи файла Kotlin.
File.readBytes() : returns entire content of file as a ByteArray
- Prepare file object with the location passed as argument to File constructor.
- Use File.readBytes() function to get ByteArray. This byte array contains all the file contents.
- 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.forEachLine() : Read a file line by line in Kotlin
- Prepare file object with the location passed as argument to File constructor.
- 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
- Prepare file object with the location of the file passed as argument to File class constructor.
- File.inputStream() returns a new InputStream for the file.
- 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.
9.1.3. Обход файлового дерева
Kotlin предоставляет удобные функции для обхода дерева файлов.
функция ходьбы: пройтись по дереву файлов
В следующем примере выполняется перебор всех файлов в указанной папке.
Приведенный выше тестовый код выведет все подкаталоги и их файлы в текущем каталоге.
Мы также можем перебрать все файлы подкаталогов ниже текущего файла и сохранить его в Итераторе
Мы перебираем все файлы подкаталогов в текущем файле, а также можем фильтровать по условиям и сохранять результаты в Sequence
Обход дерева файлов требует вызова метода расширения walk (). Он вернет объект FileTreeWalk, и у него есть несколько методов для установки направления и глубины обхода, подробности см. В документации по FileTreeWalk API.
Копировать файлы рекурсивно
Скопируйте файл или рекурсивно скопируйте каталог и все его вложенные файлы по указанному пути. Если файл по указанному пути не существует, он будет создан автоматически.
copyRecursively подпись функции:
9.1 Файловые операции ввода-вывода
API операций ввода-вывода Kotlin находится в пакете kotlin.io. Принцип Котлина состоит в том, чтобы использовать Java напрямую, если он уже имеет хорошее применение, и расширять его на основе исходного класса, если он плохой или нет. Например, Котлин написал функции расширения для класса File.
Kotlin расширяет класс java.io.File множеством полезных функций расширения, которые находятся в файле исходного кода kotlin / io / FileReadWrite.kt. Мы рассмотрим это ниже.
В то же время, Kotlin также сделал простые расширения для InputStream, OutputStream и Reader. В основном они находятся в следующих двух исходных файлах:
kotlin/io/IOStreams.kt |
---|
kotlin/io/ReadWrite.kt |
Сериализация Колтина напрямую использует псевдоним типа класса сериализации Java:
Давайте кратко представим операции чтения и записи файла Kotlin. Общие API чтения и записи файлов в Kotlin показаны в следующей таблице
Подпись функции | Описание функции |
---|---|
File.readText(charset: Charset = Charsets.UTF_8): String | Прочитать все содержимое файла в виде строки |
File.readLines(charset: Charset = Charsets.UTF_8): List | Прочитайте каждую строку файла, сохраните ее в List и верните |
File.readBytes(): ByteArray | Прочитать все содержимое файла и вернуть его как ByteArray |
File.writeText(text: String, charset: Charset = Charsets.UTF_8): Unit | Перезаписать текстовую строку в файл |
File.writeBytes(array: ByteArray): Unit | Перезаписать массив байтов потоком ByteArray |
File.appendText(text: String, charset: Charset = Charsets.UTF_8): Unit | Добавить текстовую строку в конец файла |
File.appendBytes(array: ByteArray): Unit | Добавить ByteArray в конец файла |
15.9.3 Переменное поле
Аналогично, у Kotlin нет ключевого слова volatile, но есть аннотация @Volatile.
@Volatile помечает поля резервного копирования JVM как изменяемые.
Конечно, у нас есть лучшие параллельные библиотеки сопрограмм в Котлине. В практике разработки кода мы можем свободно выбирать в соответствии с реальной ситуацией.
9.5 Многопоточное программирование
У Kotlin нет синхронизированных и изменчивых ключевых слов. Kotlin Any похож на Java Object, но не имеет методов wait (), notify () и notifyAll ().
Так как же работает параллелизм в Котлине? Будьте уверены, поскольку Kotlin стоит на плечах Java, конечно, поддержка многопоточного программирования неизбежна - Kotlin упрощает наше кодирование, инкапсулируя классы потоков в Java. В то же время мы также можем использовать некоторые конкретные аннотации и напрямую использовать ключевые слова синхронизации в Java. Давайте кратко представим соответствующий контент многопоточного программирования с Kotlin.
15.7. Выполнение командной строки оболочки
Мы используем файловые операции ввода-вывода Groovy, которые кажутся очень полезными, такие как
Файловый IO и сетевой IO-операции в Kotlin так же просты, как Groovy.
Кроме того, из приведенного выше кода мы видим, что выполнить команды терминала с помощью Groovy очень просто:
В Kotlin такие функции, как класс String и Process, еще не расширены. На самом деле, расширение такой функции очень просто. Мы можем расширить себя.
Во-первых, давайте расширим функцию execute () строки.
Затем давайте расширим текстовую функцию до класса Process.
После выполнения двух простых функций расширения, описанных выше, мы можем выполнить команды терминала, такие как Groovy, в следующем тестовом коде:
Фактически, благодаря изучению многих предыдущих примеров, мы можем видеть, что функции расширения Котлина весьма практичны. Язык API Kotlin сам по себе широко использует расширения.
9.5.3 Переменное поле
Аналогично, у Kotlin нет ключевого слова volatile, но есть аннотация @Volatile.
@Volatile помечает поля резервного копирования JVM как изменяемые.
Конечно, у нас есть лучшие параллельные библиотеки сопрограмм в Котлине. В практике разработки кода мы можем свободно выбирать в соответствии с реальной ситуацией.
File.bufferedReader() : How to read contents of a file into BufferedReader
- Prepare file object with the location of the file passed as argument to File class constructor.
- File.bufferedReader returns a new BufferedReader for reading the content of the file.
- Use BufferedReader.readLines() to read the content of the file.
Kotlin Program – example.kt
Output
Content of file is printed to the console.
9.4 Регулярные выражения
В Kotlin, в дополнение к прежнему использованию Java Pattern, Matcher и других классов, Kotlin также предоставляет класс регулярного выражения kotlin / text / regex / Regex.kt. Мы используем конструктор Regex для создания регулярного выражения ,
9.4.1. Построение выражения регулярного выражения
Используйте конструктор Regex
Параметр сопоставления RegexOption является обычным параметром сопоставления в шаблоне класса Java, который используется напрямую.
Функция расширения ToRegex с использованием String
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.
- Prepare file object with the location passed as argument to File constructor.
- 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.
15.8.3 Использование классов регулярных выражений Java
В дополнение к функциям, предоставляемым Kotlin выше, мы все еще можем использовать API регулярных выражений Java в Kotlin.
Приведенный выше код запускает вывод:
9.3 Выполнение команд оболочки
Мы используем файловые операции ввода-вывода Groovy, которые кажутся очень полезными, такие как
Файловый IO и сетевой IO-операции в Kotlin так же просты, как Groovy.
Кроме того, из приведенного выше кода мы видим, что выполнить команды терминала с помощью Groovy очень просто:
В Kotlin такие функции, как класс String и Process, еще не расширены. На самом деле, расширение такой функции очень просто. Мы можем расширить себя.
Во-первых, давайте расширим функцию execute () строки.
Затем давайте расширим текстовую функцию до класса Process.
После выполнения двух простых функций расширения, описанных выше, мы можем выполнить команды терминала, такие как Groovy, в следующем тестовом коде:
Фактически, благодаря изучению многих предыдущих примеров, мы можем видеть, что функции расширения Котлина весьма практичны. Язык API Kotlin сам по себе широко использует расширения.
15.3.1 Чтение файлов
Прочитать все содержимое файла
Если мы просто читаем файл, мы можем использовать метод readText (), который напрямую возвращает все содержимое файла. Пример кода выглядит следующим образом
Мы напрямую используем объект File для вызова функции readText, чтобы получить все содержимое файла, которое возвращает строку. Если вы указываете кодировку символов, вы можете указать ее, передав параметр Charset.
Если мы хотим получить содержимое каждой строки файла, мы можем просто передать split("\n") Получить массив содержимого каждой строки.
Получить содержимое каждой строки файла
Мы также можем напрямую вызвать инкапсулированную функцию readLines Kotlin, чтобы получить содержимое каждой строки файла. Функция readLines возвращает список, содержащий содержимое каждой строки.
Управление байтовыми массивами напрямую
Если мы хотим напрямую манипулировать байтовым массивом файла, мы можем использовать readBytes (). Если вы хотите использовать традиционный способ Java, вы можете использовать его так же свободно, как Groovy в Kotlin.
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.
I'm still pretty much a beginner in kotlin and android studio. I can access most of the android widgets but I cannot access files and so far I managed to come across only the following code which does not work. The app crashes.
It will be much appreciated if I can also know how to create the file at a specific location. Like at root directory or internal storage or in a file in the internal storage. Thanks..
Министский Котин Глава 15. Операции ввода-вывода в файле Kotlin File, регулярные выражения и многопоточность
Нажмите здесь>Купить в торговом центре Jingdong
Нажмите здесь>Покупайте и читайте на Tmall
Мы чувствуем себя очень удобно при использовании файлового ввода-вывода Groovy. Тот же Kotlin также имеет хороший API для операций ввода-вывода файлов. Точно так же некоторые полезные расширения возможностей регулярных выражений Java были сделаны в Kotlin. А многопоточность в Kotlin в основном заключает в себе многопоточность API Java. Поскольку эти Java уже имеют много базовых API, Kotlin не повторил саму реализацию, но сделал практические расширения функций на основе Java.
В этой главе мы представим операции ввода-вывода файла Kotlin, регулярные выражения и многопоточность.
15.9.2 Методы и блоки синхронизации
синхронизированный - это не ключевое слово в Kotlin, оно заменяется аннотацией @Synchronized. Объявление синхронного метода в Kotlin будет выглядеть так:
Аннотация @Synchronized имеет тот же эффект, что и синхронизация в Java: она помечает методы JVM как синхронизированные. Для синхронизированных блоков мы используем функцию synchronized (), которая принимает блокировку в качестве параметра:
В основном так же, как Java.
Читайте также: