Introducción al trabajo con el sistema de archivos en Kotlin
\n\nTrabajar con el sistema de archivos es una de las tareas básicas que enfrenta todo desarrollador. Independientemente de si escribes una aplicación de consola, un servicio web o una aplicación móvil para Android, la capacidad de leer, escribir y gestionar archivos es una habilidad obligatoria. En este artículo, analizaremos en detalle cómo trabajar con el sistema de archivos en Kotlin, utilizando tanto las herramientas estándar de Java como las capacidades modernas del lenguaje.
\n\nKotlin es un lenguaje de programación moderno, conciso y seguro que es completamente compatible con Java. Esto significa que puedes usar todas las capacidades de java.io y java.nio.file, pero escribiendo código mucho más corto y expresivo. El artículo está dirigido a desarrolladores principiantes que ya están familiarizados con los conceptos básicos de la sintaxis de Kotlin.
Clases y métodos principales para trabajar con archivos
\n\nAntes de pasar a la práctica, conozcamos las clases clave que necesitarás para trabajar con el sistema de archivos en Kotlin:
\n\n- \n
java.io.File— la clase principal para representar archivos y directorios. \n java.nio.file.Path— una interfaz moderna para trabajar con rutas. \n java.nio.file.Files— una clase de utilidad con muchos métodos estáticos. \n java.io.BufferedReaderyjava.io.BufferedWriter— para lectura y escritura línea por línea. \n
Kotlin también tiene sus propias extensiones convenientes para la clase File, que hacen que el código sea aún más simple. Por ejemplo, las funciones readText(), writeText(), appendText() y otras.
Creación de archivos y directorios
\n\nEmpecemos con lo más simple: la creación de un archivo. En Kotlin, esto se hace en una sola línea:
\n\nimport java.io.File\n\nfun main() {\n val file = File("example.txt")\n file.createNewFile() // crea el archivo si no existe\n println("Archivo creado: ${file.absolutePath}")\n}\n\nTen en cuenta: createNewFile() devuelve un Boolean — true si el archivo fue creado, y false si ya existe. Para crear directorios se utiliza el método mkdir() o mkdirs() (crea todas las carpetas padre faltantes):
fun main() {\n val dir = File("myFolder/subFolder")\n if (dir.mkdirs()) {\n println("Directorio creado: ${dir.absolutePath}")\n } else {\n println("No se pudo crear el directorio")\n }\n}\n\nLectura de datos desde un archivo
\n\nExisten varias formas de leer un archivo en Kotlin. Veamos las más populares.
\n\nLectura de todo el archivo completo
\n\nSi el archivo es pequeño, es conveniente leer su contenido en una sola cadena o lista de líneas:
\n\nfun main() {\n val file = File("readme.txt")\n \n // Lectura de todo el texto en una sola cadena\n val text: String = file.readText()\n println("Contenido del archivo:\\n$text")\n \n // Lectura línea por línea\n val lines: List<String> = file.readLines()\n lines.forEach { println("Línea: $it") }\n}\n\nEl método readText() devuelve una cadena, y readLines() devuelve una lista de líneas. Ambos métodos cierran automáticamente el archivo después de la lectura, lo cual es seguro y conveniente.
Lectura línea por línea con almacenamiento en búfer
\n\nPara archivos grandes, es mejor usar BufferedReader para no cargar todo el archivo en la memoria:
fun main() {\n val file = File("large_file.txt")\n file.bufferedReader().use { reader ->\n var line: String?\n while (reader.readLine().also { line = it } != null) {\n println("Leyendo: $line")\n }\n }\n}\n\nLa construcción .use { } garantiza que el recurso se cerrará después de que finalice el bloque, incluso si ocurre una excepción.