Introducción
Trabajar con el sistema de archivos es una de las tareas básicas en cualquier lenguaje de programación. En Kotlin, gracias a su sintaxis concisa y las potentes extensiones de la biblioteca estándar de Java, realizar operaciones con archivos y directorios se vuelve simple e intuitivo.
En este artículo, analizaremos en la práctica las operaciones principales: creación, lectura, escritura, copia, movimiento y eliminación de archivos y carpetas. Todos los ejemplos están escritos en Kotlin y listos para usar en tus proyectos. El material será útil tanto para principiantes como para desarrolladores experimentados que deseen refrescar conocimientos o encontrar soluciones óptimas para tareas cotidianas.
Clases principales e importaciones
Para trabajar con el sistema de archivos en Kotlin se utilizan clases del paquete java.io (por ejemplo, File) y java.nio.file (por ejemplo, Path, Files). Las recomendaciones modernas prefieren java.nio.file, ya que esta API es más eficiente y conveniente.
Para todos los ejemplos necesitaremos las siguientes importaciones:
import java.io.Fileimport java.nio.file.Pathimport java.nio.file.Pathsimport java.nio.file.Filesimport java.nio.file.StandardCopyOptionimport java.nio.file.StandardOpenOptionCreación de archivo y directorio
Empecemos con lo más simple: crear un nuevo archivo y carpeta.
// Creación de directorioval dir = File("my_directory")if (!dir.exists()) { dir.mkdirs() // mkdirs() crea todos los directorios padre faltantes println("Directorio creado: ${dir.absolutePath}")}
// Creación de archivoval file = File(dir, "example.txt")if (!file.exists()) { file.createNewFile() println("Archivo creado: ${file.absolutePath}")}Observa: mkdirs() crea toda la cadena de directorios si no existe. mkdir() solo crea el último directorio y devuelve false si la carpeta padre no existe.
Lectura y escritura de archivos
Estas son las operaciones más comunes. Kotlin ofrece varias formas elegantes para trabajar con el contenido de los archivos.
Escritura en un archivo
val path = Paths.get("my_directory/write_example.txt")
// Cadena para escribirval content = "¡Hola, mundo! Esta línea está escrita en el archivo.Segunda línea."
// Escritura simple de cadena (sobrescribe el archivo)Files.writeString(path, content)
// Escritura de lista de líneasval lines = listOf("Línea 1", "Línea 2", "Línea 3")Files.write(path, lines)
// Añadir al final del archivoval additionalContent = "Línea adicional."Files.writeString(path, additionalContent, StandardOpenOption.APPEND)El método Files.writeString() apareció en Java 11 y está disponible en Kotlin/JVM. Si necesitas soporte para versiones más antiguas, usa Files.write() especificando la codificación.
Lectura de un archivo
val path = Paths.get("my_directory/write_example.txt")
// Lectura de todo el contenido en una cadenaval fullContent = Files.readString(path)println("Contenido del archivo:$fullContent")
// Lectura en una lista de líneasval allLines: List<String> = Files.readAllLines(path)allLines.forEachIndexed { index, line -> println("Línea ${index + 1}: $line")}
// Lectura usando Stream (para archivos grandes)Files.lines(path).use { stream -> stream.forEach { line -> println("Procesando línea: $line") }}La construcción .use { ... } garantiza el cierre del flujo después del procesamiento, lo cual es especialmente importante al trabajar con archivos grandes.
Copia, movimiento y renombrado
Estas operaciones también se implementan a través de java.nio.file.Files.
Copia de archivo
val source = Paths.get("my_directory/example.txt")val destination = Paths.get("my_directory/backup/example_copy.txt")