Introdução ao trabalho com o sistema de arquivos em Kotlin
Trabalhar com o sistema de arquivos é uma das tarefas básicas que todo desenvolvedor enfrenta. Independentemente de você estar escrevendo um aplicativo de console, um serviço web ou um aplicativo móvel para Android, saber ler, escrever e gerenciar arquivos é uma habilidade obrigatória. Neste artigo, vamos detalhar como trabalhar com o sistema de arquivos em Kotlin, usando tanto os recursos padrão do Java quanto os recursos modernos da linguagem.
Kotlin é uma linguagem de programação moderna, concisa e segura, totalmente compatível com Java. Isso significa que você pode usar todos os recursos de java.io e java.nio.file, mas escrevendo um código muito mais curto e expressivo. O artigo é voltado para desenvolvedores iniciantes que já conhecem os fundamentos da sintaxe do Kotlin.
Principais classes e métodos para trabalhar com arquivos
Antes de passarmos à prática, vamos conhecer as principais classes necessárias para trabalhar com o sistema de arquivos em Kotlin:
java.io.File— classe principal para representar arquivos e diretórios.java.nio.file.Path— interface moderna para trabalhar com caminhos.java.nio.file.Files— classe utilitária com vários métodos estáticos.java.io.BufferedReaderejava.io.BufferedWriter— para leitura e escrita linha por linha.
Kotlin também possui suas próprias extensões convenientes para a classe File, que tornam o código ainda mais simples. Por exemplo, as funções readText(), writeText(), appendText() e outras.
Criação de arquivos e diretórios
Vamos começar com o mais simples — a criação de um arquivo. Em Kotlin, isso é feito em uma linha:
import java.io.File
fun main() { val file = File("example.txt") file.createNewFile() // cria o arquivo se ele não existir println("Arquivo criado: ${file.absolutePath}")}Observe: createNewFile() retorna um Boolean — true se o arquivo foi criado e false se ele já existir. Para criar diretórios, use o método mkdir() ou mkdirs() (cria todas as pastas pai ausentes):
fun main() { val dir = File("myFolder/subFolder") if (dir.mkdirs()) { println("Diretório criado: ${dir.absolutePath}") } else { println("Não foi possível criar o diretório") }}Leitura de dados de um arquivo
Existem várias maneiras de ler um arquivo em Kotlin. Vamos ver as mais populares.
Leitura do arquivo inteiro
Se o arquivo for pequeno, é conveniente ler seu conteúdo em uma única string ou em uma lista de linhas:
fun main() { val file = File("readme.txt") // Leitura de todo o texto em uma única string val text: String = file.readText() println("Conteúdo do arquivo:$text") // Leitura linha por linha val lines: List<String> = file.readLines() lines.forEach { println("Linha: $it") }}O método readText() retorna uma string, e readLines() retorna uma lista de linhas. Ambos os métodos fecham automaticamente o arquivo após a leitura, o que é seguro e conveniente.
Leitura linha por linha com buffer
Para arquivos grandes, é melhor usar BufferedReader para não carregar todo o arquivo na memória:
fun main() { val file = File("large_file.txt") file.bufferedReader().use { reader -> var line: String? while (reader.readLine().also { line = it } != null) { println("Lendo: $line") } }}A construção .use { } garante que o recurso será fechado após a conclusão do bloco, mesmo se ocorrer uma exceção.