Cómo leer / escribir cadenas desde un archivo en Android

Busqué y realicé la mayoría de las preguntas aquí, ninguna de las cuales pareció resolver mi situación.

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 utilizará 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 mis puntos sobre dónde quiero que se realicen las operaciones / variables.

Espero que esto te sea útil.

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(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; } 

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

Primero, obtener un objeto de archivo

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

 File path = context.getFilesDir(); 

Para el almacenamiento externo (tarjeta SD), use:

 File path = context.getExternalFilesDir(null); 

Luego crea tu objeto de archivo:

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

Escribe una cadena en el archivo

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

O con Google Guava

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

Lea 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 usa Google Guava

 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 encoding de caracteres predeterminada en Android es UTF-8.

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

  

o

  

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

 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(); } 

Solo un poco de modificaciones en la lectura de cadenas de 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; } 

revisa el código a continuación.

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 para 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á.

Soy un principiante y tuve problemas para lograr que esto funcione hoy.

Debajo está la clase con la que terminé. Funciona, pero me preguntaba qué tan imperfecta es mi solución. De todos modos, esperaba que algunos de ustedes con más experiencia pudieran estar dispuestos a echar un vistazo a mi clase de IO y darme algunos consejos. ¡Aclamaciones!

 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(); } } } 

Para agregar un archivo existente.

  File file = new File(persistPath); BufferedWriter out = new BufferedWriter(new FileWriter(file, true), 1024); out.write(str); out.newLine(); out.close();