Leer/Escribir cadena desde/hacia un archivo en Android

9 minutos de lectura

LeerEscribir cadena desdehacia un archivo en Android
mayor aly

Quiero guardar un archivo en el almacenamiento interno obteniendo el texto ingresado desde EditText. Luego, quiero que el mismo archivo devuelva el texto ingresado en forma de cadena y lo guarde en otra cadena que se usará más adelante.

Aquí está el código:

package com.omm.easybalancerecharge;


import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText num = (EditText) findViewById(R.id.sNum);
        Button ch = (Button) findViewById(R.id.rButton);
        TelephonyManager operator = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        String opname = operator.getNetworkOperatorName();
        TextView status = (TextView) findViewById(R.id.setStatus);
        final EditText ID = (EditText) findViewById(R.id.IQID);
        Button save = (Button) findViewById(R.id.sButton);

        final String myID = ""; //When Reading The File Back, I Need To Store It In This String For Later Use

        save.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                //Get Text From EditText "ID" And Save It To Internal Memory
            }
        });
        if (opname.contentEquals("zain SA")) {
            status.setText("Your Network Is: " + opname);
        } else {
            status.setText("No Network");
        }
        ch.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                //Read From The Saved File Here And Append It To String "myID"


                String hash = Uri.encode("#");
                Intent intent = new Intent(Intent.ACTION_CALL);
                intent.setData(Uri.parse("tel:*141*" + /*Use The String With Data Retrieved Here*/ num.getText()
                        + hash));
                startActivity(intent);
            }
        });
    }

He incluido comentarios para ayudarlo a analizar más a fondo mis puntos en cuanto a dónde quiero que se realicen las operaciones/se usen las variables.

  • la pregunta es “¿cómo leer/escribir en/desde un archivo?”

    – Dmitri Gudkov

    17 de enero de 2013 a las 10:22

  • ¿Consideró usar las preferencias de la aplicación para almacenar sus cadenas?

    – sdabet

    17 de enero de 2013 a las 10:23

  • Por cierto, asegúrese de dar permiso al archivo principal, para operar con almacenamiento…

    – Dmitri Gudkov

    17 de enero de 2013 a las 10:24

  • Esta es mi aplicación medio completa con muchos cambios para implementar. Mi idea es que el usuario ingrese la ID solo una vez en la primera ejecución de la aplicación. Luego, la aplicación hará referencia a esa ID almacenada tantas veces como el usuario ejecute la aplicación. Todos los permisos se agregan al manifiesto.

    – Mayor Aly

    17 de enero de 2013 a las 10:28


LeerEscribir cadena desdehacia un archivo en Android
R9J

Espero que esto pueda ser útil para usted.

Escribir archivo:

private void writeToFile(String data,Context context) {
    try {
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.openFileOutput("config.txt", Context.MODE_PRIVATE));
        outputStreamWriter.write(data);
        outputStreamWriter.close();
    }
    catch (IOException e) {
        Log.e("Exception", "File write failed: " + e.toString());
    } 
}

Leer archivo:

private String readFromFile(Context context) {

    String ret = "";

    try {
        InputStream inputStream = context.openFileInput("config.txt");

        if ( inputStream != null ) {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String receiveString = "";
            StringBuilder stringBuilder = new StringBuilder();

            while ( (receiveString = bufferedReader.readLine()) != null ) {
                stringBuilder.append("\n").append(receiveString);
            }

            inputStream.close();
            ret = stringBuilder.toString();
        }
    }
    catch (FileNotFoundException e) {
        Log.e("login activity", "File not found: " + e.toString());
    } catch (IOException e) {
        Log.e("login activity", "Can not read file: " + e.toString());
    }

    return ret;
}

  • Si la clase no se extiende desde Actividad, el uso del método “openFileInput()” debería ser así: context.openFileInput()

    – Behzad

    21 de octubre de 2013 a las 10:17

  • Nota: El código anterior funciona bien, pero la cadena resultante no contendrá ninguno de los saltos de línea del archivo. Para volver a agregar saltos de línea, cambie la línea “stringBuilder.append(receiveString);” a “stringBuilder.append(receiveString).append(“\n”);”. Si espera otros caracteres de salto de línea (por ejemplo, los archivos de texto de Windows tendrán \r, etc.), en su cadena final, tendrá que adaptar esto un poco más.

    – los árboles están en todas partes

    9 de febrero de 2014 a las 23:57

  • ¿Dónde se guarda este archivo de configuración en un dispositivo real? No pude encontrarlo para verificar 🙁

    – Mahdi

    29 de octubre de 2014 a las 6:58

  • Creo que cerrar flujos debería estar en el final bloquear como en @SharkAlley respuesta

    – Yuri K.

    29 de julio de 2015 a las 14:41

  • @Kenji, el archivo se guarda en el directorio de archivos de la aplicación (es decir, /data/data//files/config.txt). El proceso de la aplicación puede acceder a ella, pero no a todos los procesos del sistema operativo. La implementación puede diferir según la versión de Android que ejecute su dispositivo. Puede consultar la implementación del AOSP en línea. Por ejemplo, para android 8.1_r5: android.googlesource.com/platform/frameworks/base/+/…

    – vhamon

    18 mayo 2018 a las 12:00

1646760431 441 LeerEscribir cadena desdehacia un archivo en Android
callejón de tiburones

Para aquellos que buscan una estrategia general para leer y escribir una cadena en un archivo:

Primero, obtenga un objeto de archivo

Necesitará la ruta de almacenamiento. Para el almacenamiento interno, utilice:

File path = context.getFilesDir();

Para el almacenamiento externo (tarjeta SD), utilice:

File path = context.getExternalFilesDir(null);

Luego crea tu objeto de archivo:

File file = new File(path, "my-file-name.txt");

Escribir una cadena en el archivo

FileOutputStream stream = new FileOutputStream(file);
try {
    stream.write("text-to-write".getBytes());
} finally {
    stream.close();
}

O con Google Guayaba

Contenido de la cadena = Files.toString(file, StandardCharsets.UTF_8);

Leer el archivo en una cadena

int length = (int) file.length();

byte[] bytes = new byte[length];

FileInputStream in = new FileInputStream(file);
try {
    in.read(bytes);
} finally {
    in.close();
}

String contents = new String(bytes);   

O si está utilizando Google Guayaba

String contents = Files.toString(file,"UTF-8");

Para completar mencionaré

String contents = new Scanner(file).useDelimiter("\\A").next();

que no requiere bibliotecas, pero los puntos de referencia 50% – 400% más lento que las otras opciones (en varias pruebas en mi Nexus 5).

notas

Para cada una de estas estrategias, se le pedirá que capture una IOException.

La codificación de caracteres predeterminada en Android es UTF-8.

Si está utilizando almacenamiento externo, deberá agregar a su manifiesto:

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

o

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

El permiso de escritura implica permiso de lectura, por lo que no necesita ambos.

  • Ok, por ejemplo, quiero que un usuario vea todas sus publicaciones, y cuando va a otra pantalla y regresa, ¿necesito dibujarlo nuevamente o porque está almacenado en caché, simplemente lo saca del caché y lo muestra, si simplemente lo saca, ¿cómo agrego un condicional para decir que no consulte mis servidores?

    – León789

    8 de marzo de 2014 a las 5:55

  • no lo hagas como new File(path + "/my-file-name.txt");. Esto desafía gran parte del sentido de File. Utilizar new File(path, "my-file-name.txt"); en lugar de.

    – JimmyB

    10 de agosto de 2015 a las 9:13

  • @HannoBinder Android siempre se ejecuta sobre Linux, por lo que se garantiza que el separador sea “/”. ¿Cuál sería el beneficio de usar un nuevo archivo (ruta, “mi-nombre-de-archivo.txt”) en este contexto? (Estoy feliz de actualizar la respuesta si hay una razón para hacerlo).

    – SharkAlley

    11/08/2015 a las 20:05


  • File está ahí por una razón. En su caso, también podría omitir File y solo hazlo new FileInputStream(path + "/my-file-name.txt");, que no recomiendo. (Y si path contiene un final / ¿por ejemplo?)

    – JimmyB

    12 de agosto de 2015 a las 14:28


  • Editado por su sugerencia. Gracias 🙂

    – SharkAlley

    21 de agosto de 2015 a las 17:20

1646760432 265 LeerEscribir cadena desdehacia un archivo en Android
eugenio

public static void writeStringAsFile(final String fileContents, String fileName) {
    Context context = App.instance.getApplicationContext();
    try {
        FileWriter out = new FileWriter(new File(context.getFilesDir(), fileName));
        out.write(fileContents);
        out.close();
    } catch (IOException e) {
        Logger.logError(TAG, e);
    }
}

public static String readFileAsString(String fileName) {
    Context context = App.instance.getApplicationContext();
    StringBuilder stringBuilder = new StringBuilder();
    String line;
    BufferedReader in = null;

    try {
        in = new BufferedReader(new FileReader(new File(context.getFilesDir(), fileName)));
        while ((line = in.readLine()) != null) stringBuilder.append(line);

    } catch (FileNotFoundException e) {
        Logger.logError(TAG, e);
    } catch (IOException e) {
        Logger.logError(TAG, e);
    } 

    return stringBuilder.toString();
}

  • ¿¡Aplicación!? que se supone que es!?

    – aplaudiendo

    8 de junio de 2014 a las 19:26


  • @alap Es algo que @Eugene está usando para recuperar el contexto de la aplicación de forma estática. el lo necesita para context.getFilesDir(). Simplemente puede reemplazar las ocurrencias de new File(context.getFilesDir(), fileName) con un File objeto o un String pasado a función en lugar de fileName.

    – lorenzo-s

    17 de febrero de 2015 a las 9:06


  • Obtuve la excepción de archivo no encontrado después de desinstalar la aplicación

    – famfamfam

    5 de marzo de 2021 a las 9:55

Solo un poco de modificaciones en la lectura de cadenas desde un método de archivo para un mayor rendimiento

private String readFromFile(Context context, String fileName) {
    if (context == null) {
        return null;
    }

    String ret = "";

    try {
        InputStream inputStream = context.openFileInput(fileName);

        if ( inputStream != null ) {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);               

            int size = inputStream.available();
            char[] buffer = new char[size];

            inputStreamReader.read(buffer);

            inputStream.close();
            ret = new String(buffer);
        }
    }catch (Exception e) {
        e.printStackTrace();
    }

    return ret;
}

verifique el siguiente código.

Lectura de un archivo en el sistema de archivos.

FileInputStream fis = null;
    try {

        fis = context.openFileInput(fileName);
        InputStreamReader isr = new InputStreamReader(fis);
        // READ STRING OF UNKNOWN LENGTH
        StringBuilder sb = new StringBuilder();
        char[] inputBuffer = new char[2048];
        int l;
        // FILL BUFFER WITH DATA
        while ((l = isr.read(inputBuffer)) != -1) {
            sb.append(inputBuffer, 0, l);
        }
        // CONVERT BYTES TO STRING
        String readString = sb.toString();
        fis.close();

    catch (Exception e) {

    } finally {
        if (fis != null) {
            fis = null;
        }
    }

El siguiente código es escribir el archivo en el sistema de archivos interno.

FileOutputStream fos = null;
    try {

        fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
        fos.write(stringdatatobestoredinfile.getBytes());
        fos.flush();
        fos.close();

    } catch (Exception e) {

    } finally {
        if (fos != null) {
            fos = null;
        }
    }

Creo que esto te ayudará.

1646760433 821 LeerEscribir cadena desdehacia un archivo en Android
nihilariano

Soy un poco principiante y luché para que esto funcionara hoy.

A continuación se muestra la clase con la que terminé. Funciona, pero me preguntaba cuán imperfecta es mi solución. De todos modos, esperaba que algunos de ustedes, gente más experimentada, estuvieran dispuestos a echar un vistazo a mi clase de IO y darme algunos consejos. ¡Salud!

public class HighScore {
    File data = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator);
    File file = new File(data, "highscore.txt");
    private int highScore = 0;

    public int readHighScore() {
        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            try {
                highScore = Integer.parseInt(br.readLine());
                br.close();
            } catch (NumberFormatException | IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            try {
                file.createNewFile();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
            e.printStackTrace();
        }
        return highScore;
    }

    public void writeHighScore(int highestScore) {
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter(file));
            bw.write(String.valueOf(highestScore));
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

1646760433 733 LeerEscribir cadena desdehacia un archivo en Android
darshan

los Kotlin mediante el uso de la función de extensión incorporada en File

Escribe: yourFile.writeText(textFromEditText)
Leer: yourFile.readText()

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad