Middle
Como trabalhar com ficheiros e fluxos de entrada/saída (I/O) em Kotlin?
sobes.tech IA
Resposta da IA
A biblioteca padrão do Kotlin fornece extensões convenientes para trabalhar com I/O, simplificando a interação com java.io.
Abordagens principais e classes:
-
Leitura de ficheiros:
File.readBytes(): Lê o conteúdo do ficheiro para um array de bytes.File.readText(): Lê o conteúdo do ficheiro como uma string (considerando a codificação).File.forEachLine { ... }: Processa cada linha do ficheiro.File.bufferedReader(): Cria umBufferedReaderpara leitura linha por linha.File.inputStream(): Cria umInputStreampara ler bytes.
-
Escrita em ficheiros:
File.writeBytes(bytes): Escreve um array de bytes num ficheiro.File.writeText(text, append): Escreve uma string num ficheiro.append = truepara acrescentar ao final.File.printWriter(): Cria umPrintWriterpara escrita de texto formatado.File.outputStream(): Cria umOutputStreampara escrever bytes.
-
Trabalho com fluxos:
InputStream.bufferedReader(): Envolve umInputStreamnumBufferedReader.OutputStream.printWriter(): Envolve umOutputStreamnumPrintWriter.- Funções de extensão
copyTo(outputStream)para copiar conteúdo entre fluxos.
-
Gestão de recursos (closures):
- Funções de extensão
use { ... }para fechar automaticamente fluxos e leitores/escritores, mesmo em caso de exceções.
- Funções de extensão
import java.io.File
fun main() {
val file = File("my_file.txt")
// Escrever no ficheiro
file.writeText("Olá, Kotlin I/O!")
file.appendText("\nContinuação da linha.")
// Ler linha por linha
file.forEachLine { line ->
println(line)
}
// Ler todo o conteúdo como texto
val content = file.readText()
println("\nConteúdo completo do ficheiro:")
println(content)
// Usar bufferedReader com use
file.bufferedReader().use { reader ->
reader.lines().forEach(::println) // Leitura via API de Streams do Java
}
// Copiar ficheiro
val newFile = File("my_file_copy.txt")
file.inputStream().use { input ->
newFile.outputStream().use { output ->
input.copyTo(output) // Cópia conveniente de fluxos
}
}
}
Tabela comparativa de alguns métodos:
| Método | Propósito | Tipo de dados | Linha por linha / Completo | Nota |
|---|---|---|---|---|
readBytes() |
Leitura em bytes | ByteArray |
Completo | Adequado para dados binários |
readText() |
Leitura como texto | String |
Completo | Conveniente para ficheiros de texto |
forEachLine { } |
Processar cada linha | String |
Linha por linha | Ideal para grandes ficheiros de texto |
bufferedReader() |
Criar um leitor bufferizado | N/A | Fluxo | Controlo flexível, requer use |
writeBytes() |
Escrever bytes | ByteArray |
Completo | Adequado para dados binários |
writeText() |
Escrever texto | String |
Completo/Adicionar | Conveniente para ficheiros de texto |
printWriter() |
Criar um escritor formatado | N/A | Fluxo | Útil para saída formatada, requer use |
O uso de use { ... } é fundamental para trabalhar com segurança com I/O em Kotlin, garantindo a libertação de recursos. Kotlin estende as classes Java existentes (File, InputStream, OutputStream, etc.) com funções úteis.