Назад к вопросам
Middle
272
questionbank
Как работать с файлами и потоками ввода-вывода (I/O) в Kotlin?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В Kotlin стандартная библиотека предоставляет удобные расширения для работы с I/O, упрощая взаимодействие с java.io.
Основные подходы и классы:
-
Чтение из файла:
File.readBytes(): Читает содержимое файла в массив байт.File.readText(): Читает содержимое файла как строку (с учетом кодировки).File.forEachLine { ... }: Обрабатывает каждую строку файла.File.bufferedReader(): СоздаетBufferedReaderдля построчного чтения.File.inputStream(): СоздаетInputStreamдля чтения байтов.
-
Запись в файл:
File.writeBytes(bytes): Записывает массив байт в файл.File.writeText(text, append): Записывает строку в файл.append = trueдля добавления в конец.File.printWriter(): СоздаетPrintWriterдля удобной записи форматированного текста.File.outputStream(): СоздаетOutputStreamдля записи байтов.
-
Работа с потоками:
InputStream.bufferedReader(): ОбертываетInputStreamвBufferedReader.OutputStream.printWriter(): ОбертываетOutputStreamвPrintWriter.- Функции расширения типа
copyTo(outputStream)для копирования содержимого потоков.
-
Обработка ресурсов (closures):
- Функции расширения
use { ... }для автоматического закрытия потоков и ридеров/врайтеров, даже в случае исключений.
- Функции расширения
import java.io.File
fun main() {
val file = File("my_file.txt")
// Запись в файл
file.writeText("Привет, Kotlin I/O!")
file.appendText("\nПродолжение строки.")
// Чтение из файла построчно
file.forEachLine { line ->
println(line)
}
// Чтение всего файла как строки
val content = file.readText()
println("\nВесь контент файла:")
println(content)
// Использование bufferedReader с use
file.bufferedReader().use { reader ->
reader.lines().forEach(::println) // Чтение через Java Stream API
}
// Копирование файла
val newFile = File("my_file_copy.txt")
file.inputStream().use { input ->
newFile.outputStream().use { output ->
input.copyTo(output) // Удобное копирование потоков
}
}
}
Таблица сравнения некоторых методов:
| Метод | Назначение | Тип данных | Построчный/Целиком | Примечание |
|---|---|---|---|---|
readBytes() |
Чтение в байты | ByteArray |
Целиком | Подходит для бинарных данных |
readText() |
Чтение как строку | String |
Целиком | Удобно для текстовых файлов |
forEachLine { } |
Обработка каждой строки | String |
Построчный | Идеально для больших текстовых файлов |
bufferedReader() |
Создание буферизированного ридера | N/A | Потоковый | Гибкий контроль, требует use |
writeBytes() |
Запись байтов | ByteArray |
Целиком | Подходит для бинарных данных |
writeText() |
Запись строки | String |
Целиком/Добавление | Удобно для текстовых файлов |
printWriter() |
Создание врайтера с форматированием | N/A | Потоковый | Удобно для форматированного вывода, требует use |
Использование use { ... } является ключевым для безопасной работы с I/O в Kotlin, гарантируя освобождение ресурсов. Kotlin расширяет существующие Java классы (File, InputStream, OutputStream и т.д.) удобными функциями.