Como escribir un fichero txt en android studio

publicado por: Anonymous

Buenas llevo intentando un par de dias escribir un fichero txt con mi app para poder leerlo posteriormente y usar esos datos, el problema es que no encuentro el fichero en la ruta que le pongo ni tampoco parece que escriba nada, tengo los permisos puestos en el manifest y tambien lo e intentado creando un metodo que llame a un objeto file

public static void statusFile(){

    FileOutputStream fileOutputStream = null;
    if(!fich.exists()){
        try {
            fich.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Pero tampoco funciona, e creado de forma estatica los parametros de la clase que serian los siguientes

static String direccion = "/storage/emulated/0/food.txt";
static File fich = new File(direccion);

En el manifest tengo puesto los siguientes permisos

    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Para terminar he hecho el metodo escribir en el cual le paso los parametros a traves de un objeto llamado comida que lo relleno antes de enviarlo

    public static String writeFile(Food f){

    String linea = "";
    try {
        BufferedWriter br = new BufferedWriter(new FileWriter(direccion, true));
        linea += f.getNombre()+";";
        linea += f.getFechaCompra()+";";
        linea += f.getFechaCaducidad();

        br.write(linea);

    } catch (IOException e) {
        e.printStackTrace();
    }


    return linea;
}

solución

Primeramente el problema que impide crear un archivo es el permiso, para dispositivos con sistema operativo mayor a 6.0 no es suficiente declarar el permiso WRITE_EXTERNAL_STORAGE dentro de tu androidManifest.xml:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

debes realizar la petición manual:

int permissionCheck = ContextCompat.checkSelfPermission(
        this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
    Log.i("Mensaje", "No se tiene permiso para leer.");
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 225);
} else {
    Log.i("Mensaje", "Se tiene permiso para leer y escribir!");
}

Error al mostrar el directorio externo de archivos en un AlertDialog en android 6.0 (READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE )

por cierto no es necesario el permiso READ_INTERNAL_STORAGE


De acuerdo a lo anterior, este método puede funcionar sin problema:

static String direccion = "/storage/emulated/0/food.txt";
static File fich = new File(direccion);

public static void statusFile(){

    FileOutputStream fileOutputStream = null;
    if(!fich.exists()){
        try {
            fich.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Pero te sugiero que en lugar de definir la ruta fija:

static String direccion = "/storage/emulated/0/food.txt";

user Environment.getExternalStorageDirectory() para obtener la ruta del directorio de almacenamiento externo, ya que la ruta puede no existir o ser diferente en algún modelo o tipo de dispositivo android,

static String direccion = Environment.getExternalStorageDirectory() + "/food.txt";

Si tu app apunta a targetSDK 29 el método Environment.getExternalStorageDirectory() es marcado como obsoleto. Por lo tanto en este caso debes usar getExternalFilesDir()

static String direccion;
static File fich;

public static void statusFile(Context context){

    direccion = context.getExternalFilesDir(null) + "/food32.txt";
    fich = new File(direccion);

    FileOutputStream fileOutputStream = null;
    if(!fich.exists()){
        try {
            fich.createNewFile();
        } catch (IOException e) {
            Log.e(TAG, "Error statusFile" + e.getMessage());
        }
    }

}

de esta forma llamarías el método:

statusFile(getApplicationContext());

La diferencia aquí es que el archivo ahora se tendrá que guardar dentro del paquete de la aplicación.

/storage/emulated/0/Android/data/<paquete de aplicación>/files/food.txt
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *