Ficheros en Kotlin

Manejo de ficheros en Kotlin

Gestión de datos (2 – Ficheros)

I/O Streams

Lectura y Escritura de Ficheros en Java

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() {
        






    }
}

Cómo solicitar permiso

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() {








}

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:

    • Ejemplo de RuntimePermissionsBasic de Android Java | Kotlin

 

Tarea online: Alarmas

Deja una respuesta