Trabajo con el sistema de archivos en Kotlin: de la teoría a la práctica
\n\nTrabajar con el sistema de archivos es una de las tareas básicas que todo desarrollador enfrenta. En Kotlin, gracias a su estrecha integración con Java y sus propias y convenientes extensiones, la gestión de archivos y directorios se vuelve intuitiva y concisa. En este artículo, analizaremos las operaciones clave: creación, lectura, escritura y eliminación de archivos, así como el trabajo con directorios. Todos los ejemplos están escritos en Kotlin y listos para usar en tus proyectos.
\n\nFundamentos: configuración y primeros pasos
\n\nKotlin no tiene su propia biblioteca separada para trabajar con el sistema de archivos; utiliza completamente el poder de java.io.File, añadiéndole numerosas funciones de extensión. Esto significa que puedes usar los métodos familiares de Java, pero con una sintaxis más corta y segura.
import java.io.File\n\nfun main() {\n val file = File("example.txt")\n println(file.exists()) // false, si el archivo no existe\n}\n\nLa clase principal es java.io.File. Representa una abstracción de la ruta a un archivo o directorio, que no necesariamente existe en el disco.
Lectura y escritura de archivos en Kotlin
\n\nKotlin ofrece formas elegantes de leer y escribir, que eliminan la necesidad de gestionar manualmente los flujos y cerrar los recursos.
\n\nLectura de todo el contenido de un archivo
\n\nLa forma más sencilla es usar la función readText(). Lee todo el archivo en una sola cadena.
fun readEntireFile() {\n val file = File("data.txt")\n if (file.exists()) {\n val content: String = file.readText()\n println(content)\n } else {\n println("Archivo no encontrado")\n }\n}\n\nSi el archivo es grande, es mejor leerlo línea por línea:
\n\nfun readLines() {\n File("log.txt").useLines { lines ->\n lines.forEach { line ->\n println(line)\n }\n }\n // useLines cerrará el flujo automáticamente\n}\n\nEscritura en un archivo
\n\nPara escribir, usa writeText() (sobrescribe el archivo) o appendText() (agrega al final).
fun writeToFile() {\n val file = File("output.txt")\n file.writeText("¡Hola, Kotlin!\\n")\n file.appendText("Esta es la segunda línea.")\n \n println(file.readText())\n // Salida:\n // ¡Hola, Kotlin!\n // Esta es la segunda línea.\n}\n\nPara datos más complejos (por ejemplo, escribir una lista de cadenas), es conveniente usar writeLines():
fun writeListOfLines() {\n val lines = listOf("Línea 1", "Línea 2", "Línea 3")\n File("list.txt").writeLines(lines)\n}\n\nCreación, copia y eliminación de archivos y directorios
\n\nGestionar la estructura de archivos es otra tarea común. Veamos las operaciones principales.
\n\nCreación de archivos y carpetas
\n\nEl método createNewFile() crea un nuevo archivo vacío si aún no existe. Para crear directorios, usa mkdir() (crea solo la última carpeta en la ruta) o mkdirs() (crea todos los directorios padre faltantes).
fun createStructure() {\n val dir = File("my_project/src/main")\n if (dir.mkdirs()) {\n println("Directorio creado: ${dir.absolutePath}")\n }\n \n val newFile = File(dir, "config.ini")\n if (newFile.createNewFile()) {\n println("Archivo creado: ${newFile.name}")\n }\n}\n\nCopia y movimiento
\n\n¿Kotlin no tiene una función incorporada copyTo? ¡En realidad sí la tiene! El método copyTo() permite copiar archivos fácilmente, y renameTo() permite renombrarlos o moverlos.
fun copyAndMove() {\n val source = File("source.txt")\n val destination = File("backup/source_copy.txt")\n \n // Copia\n source.copyTo(destination, overwrite = true)\n \n // Mov