Ficheros en Kotlin
Manejo de ficheros en Kotlin
Gestión de datos (2 – Ficheros)
I/O Streams
Lectura y Escritura de Ficheros en Java
Lectura y escritura en Kotlin
Exception Handling in Kotlin
Ejemplo: ficheros en Kotlin (en Intellij Idea)
import java.io.File import java.io.IOException fun main() { val ruta = "test.txt" val archivo = File(ruta) val texto = "hola\nun ejemplo de fichero\nadios" try { println("Manejo de ficheros") if (escribir(archivo, texto)) { println("Fichero $ruta escrito ok") } println("Archivo leído:\n" + leer(archivo)) } catch (e: IOException) { println ("Error: " + e.message.toString()) } } @Throws(IOException::class) private fun escribir(fichero: File, cadena: String): Boolean { val correcto = true val bufferedWriter = fichero.bufferedWriter() bufferedWriter.write(cadena) bufferedWriter.close() return correcto } @Throws(IOException::class) private fun leer(fichero: File): String { //val bufferedReader = fichero.bufferedReader() //val text: List<String> = bufferedReader.readLines() val inputString = fichero.bufferedReader ().use { it.readText () } println (inputString) fichero.bufferedReader().close() //return text.toString() return inputString }
Ejemplo: Permiso en memoria externa
Crear un nuevo proyecto en Kotlin: MemoriaExternaKotlin
Añadir el permiso al manifiesto:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
build.gradle
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") } android { namespace = "com.example.memoriaexternakotlin" compileSdk = 34 buildFeatures { viewBinding = true }
dependencias
dependencies { implementation("androidx.fragment:fragment-ktx:1.6.2") // or later implementation("androidx.activity:activity-ktx:1.8.2") // or later }
strings.xml
<resources> <string name="app_name">Memoria Externa en Kotlin</string> <string name="texto">una prueba de escritura en memoria externa</string> <string name="botonEsc">Guardar</string> <string name="botonLee">Leer</string> <string name="propiedades">Propiedades del fichero</string> </resources>
activity_main.xml
<?xml version = "1.0" encoding = "utf-8" ?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <EditText android:id="@+id/editText" android:layout_width="353dp" android:layout_height="96dp" android:layout_marginLeft="20dp" android:layout_marginEnd="28dp" android:ems="10" android:gravity="top|left" android:hint="@string/texto" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.042"> </EditText> <Button android:id="@+id/botonEscribir" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="36dp" android:layout_marginTop="24dp" android:layout_marginEnd="228dp" android:text="@string/botonEsc" app:layout_constraintBottom_toTopOf="@+id/textView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText" app:layout_constraintVertical_bias="0.0" /> <Button android:id="@+id/botonLeer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="49dp" android:layout_marginTop="8dp" android:layout_marginEnd="44dp" android:text="@string/botonLee" app:layout_constraintBottom_toTopOf="@+id/textView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintLeft_toRightOf="@+id/botonEscribir" app:layout_constraintTop_toBottomOf="@+id/editText" app:layout_constraintVertical_bias="0.38" /> <TextView android:id="@+id/textView" android:layout_width="350dp" android:layout_height="232dp" android:text="@string/propiedades" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.59" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editText" app:layout_constraintVertical_bias="0.257" /> </androidx.constraintlayout.widget.ConstraintLayout>
objeto Memoria
object Memoria { @JvmStatic @Throws(IOException::class) fun escribirExterna(fichero: String, cadena: String): Boolean { val tarjeta: File = Environment.getExternalStorageDirectory() val miFichero = File(tarjeta.absolutePath, fichero) //tarjeta = Environment.getExternalStoragePublicDirectory("datos/programas/"); //tarjeta.mkdirs(); return escribir(miFichero, cadena) } @Throws(IOException::class) private fun escribir(fichero: File, cadena: String): Boolean { val correcto = true val bufferedWriter = fichero.bufferedWriter() bufferedWriter.write(cadena) bufferedWriter.close() return correcto /* lateinit var fos: FileOutputStream lateinit var osw: OutputStreamWriter lateinit var out: BufferedWriter val correcto = true fos = FileOutputStream(fichero) osw = OutputStreamWriter(fos) out = BufferedWriter(osw) out.write(cadena) out.close() return correcto */ } fun mostrarPropiedades(fichero: File): String { var formato: SimpleDateFormat = SimpleDateFormat("dd-MM-yyyy hh:mm:ss", Locale.getDefault()) val txt = StringBuffer() try { if (fichero.exists()) { txt.append(fichero.name + '\n') txt.append(fichero.absolutePath + '\n') txt.append("Tamaño (bytes): " + fichero.length() + '\n') txt.append("Fecha: " + formato.format(Date(fichero.lastModified()))) } else txt.append("No existe el fichero " + fichero.name) } catch (e: Exception) { Log.e("Error", e.message.toString()) txt.append(e.message) } return txt.toString() } @JvmStatic fun mostrarPropiedadesExterna(fichero: String): String { val tarjeta: File = Environment.getExternalStorageDirectory() val miFichero = File(tarjeta.absolutePath, fichero) return mostrarPropiedades(miFichero) } @JvmStatic fun disponibleEscritura(): Boolean { var escritura = false //Comprobamos el estado de la memoria externa (tarjeta SD) val estado = Environment.getExternalStorageState() if (estado == Environment.MEDIA_MOUNTED) escritura = true return escritura } fun disponibleLectura(): Boolean { var lectura = false //Comprobamos el estado de la memoria externa (tarjeta SD) val estado = Environment.getExternalStorageState() if (estado == Environment.MEDIA_MOUNTED_READ_ONLY || estado == Environment.MEDIA_MOUNTED) lectura = true return lectura } @JvmStatic @Throws(IOException::class) fun leerExterna(fichero: String?): String { val miFichero: File val tarjeta: File //tarjeta = Environment.getExternalStoragePublicDirectory("datos/programas/"); tarjeta = Environment.getExternalStorageDirectory() miFichero = File(tarjeta.absolutePath, fichero) return leer(miFichero) } @Throws(IOException::class) private fun leer(fichero: File): String { val inputString = fichero.bufferedReader ().use { it.readText () } fichero.bufferedReader().close() return inputString /* lateinit var fis: FileInputStream lateinit var isw: InputStreamReader lateinit var br: BufferedReader lateinit var linea: String val miCadena = StringBuilder() fis = FileInputStream(fichero) isw = InputStreamReader(fis) br = BufferedReader(isw) //while ((n = in.read()) != -1) // miCadena.append((char) n); linea = br.readLine() while ( linea != null) { miCadena.append(linea).append('\n') linea = br.readLine() } br.close() return miCadena.toString() */ } }
MainActivity.kt
class MainActivity : AppCompatActivity(), View.OnClickListener { lateinit var binding: ActivityMainBinding //private lateinit var memoria: Memoria companion object { const val FICHERO = "ficheroExterna.txt" const val REQUEST_WRITE = 1 } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) binding = ActivityMainBinding.inflate(layoutInflater) val view: View = binding.root setContentView(view) binding.botonEscribir.setOnClickListener(this) binding.botonLeer.setOnClickListener(this) } override fun onClick(view: View) { // Si pulsamos en el botón escribir if (view === binding.botonEscribir) guardar() else if (view === binding.botonLeer) leer() } fun guardar() { val permiso = Manifest.permission.WRITE_EXTERNAL_STORAGE } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<String>, grantResults: IntArray ) { } private fun mostrarMensaje(texto: String) { Toast.makeText(this, texto, Toast.LENGTH_SHORT).show() } private fun escribir(texto: String) { } private fun leer() { } }
Guardar el fichero en memoria externa y pedir el permiso para escribir
public void guardar() { String permiso = Manifest.permission.WRITE_EXTERNAL_STORAGE; } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { String permiso = Manifest.permission.WRITE_EXTERNAL_STORAGE; } private void mostrarMensaje(String texto) { Toast.makeText(this, texto, Toast.LENGTH_SHORT).show(); }
escribir
private void escribir() { }
leer
private void leer() { }
Recursos adicionales
Descripción general del almacenamiento de archivos y datos
Para obtener información adicional sobre permisos, consulta los siguientes artículos:
Para descubrir cómo solicitar permisos, descarga las siguientes apps de ejemplo:
Tarea online: Alarmas
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.