Cómo leer / escribir cadena de un archivo en Android

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

Quiero guardar un archivo en el almacenamiento interno obteniendo el texto introducido de EditText. Entonces quiero que el mismo archivo devuelva el texto introducido en forma de Cadena y guárdelo en otra Cadena que se va a usar más tarde.

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 ayudarle a analizar más a fondo mis puntos en cuanto a dónde quiero que se realicen las operaciones / variables que se utilizarán.

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(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 de archivos:

En primer lugar, obtener 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); 

A continuación, cree el 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

 Files.write("text-to-write", file, "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 utilizas Google Guava

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

Para completar, voy a mencionar

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

Que no requiere bibliotecas, sino 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.

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

Sólo modificaciones aa bit en la cadena de lectura de un método de archivo para más 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; } 

Compruebe el código abajo.

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

Debajo de 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á.

Para anexar un archivo existente.

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

Soy un poco de un principiante y luché conseguir esto para trabajar hoy.

Debajo está la clase con la que terminé. Funciona, pero me preguntaba cómo es imperfecta mi solución. De todos modos, esperaba que algunos de ustedes más experimentados 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(); } } } 
  • String-arrays de referencia en android strings.xml
  • Margen ajustado a la primera línea de textView
  • Escribir archivo .json y leer ese archivo en Android
  • Android: evita romper la línea en las partes TextView String
  • Android: ¿Cómo url de la tienda en el archivo de recursos string.xml?
  • Marcador de posición de la cadena de Android diferentes idiomas
  • Cadena dinámica utilizando String.xml?
  • ¿Por qué la marquesina no funciona en Widget?
  • ¿Cómo referenciar una cadena de otro paquete en una biblioteca usando XML en Android?
  • android: límite de 10 caracteres por línea TextView
  • ¿Cómo puedo obtener una cadena de mi respuesta http android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.