2012-02-01 16 views
28

¿Algún experto disponible para ayudarme? En mi actividad principal de Android, intento guardar un String en un archivo y luego recuperarlo si el usuario lo configuró antes. No pude encontrar ningún ejemplo cercano a lo que estoy haciendo. ¡Agradecería cualquier ayuda! Aquí está mi caso de prueba que se estrella:Android FileInputStream read() txt file to String

String testString = "WORKS"; 
String readString; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    FileOutputStream fos; 

    try { 
     fos = openFileOutput("test.txt", Context.MODE_PRIVATE); 
     fos.write(testString.getBytes()); 
     fos.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 

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

    } 

    File file = getBaseContext().getFileStreamPath("test.txt"); 

    if (file.exists()) { 

     FileInputStream fis; 

     try { 
      fis = openFileInput("test.txt"); 
      fis.read(readString.getBytes()); 
      fis.close(); 

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

     } 

     txtDate.setText(String.valueOf(readString)); 

     } else { 
        // more code 
     } 
    } 
} 
+0

¿Por qué utilizar un archivo? Intente usar [SharedPreferences] (http://developer.android.com/reference/android/content/SharedPreferences.html) - mucho menos código y desorden. – Jens

+0

¿Qué error estás recibiendo? –

Respuesta

59

Para leer el archivo intente esto:

FileInputStream fis; 
fis = openFileInput("test.txt"); 
StringBuffer fileContent = new StringBuffer(""); 

byte[] buffer = new byte[1024]; 

while ((n = fis.read(buffer)) != -1) 
{ 
    fileContent.append(new String(buffer, 0, n)); 
} 
+2

Por favor, ayúdenme un poco, la segunda línea muestra error openFileInput no está definido ... ¿qué hacer? –

+0

@someone_smiley - ¿Dónde escribes esta línea de código? Es un método de actividad. Entonces, coloque su código en la Actividad o use el Contexto de la Actividad con este método. – user370305

+0

hi @ user370305 - mi código no está en ninguna actividad. es solo una clase que tuve la intención de diseñar para facilitar alguna tarea. Enviaré la ruta del archivo como parámetro de una clase (nuevamente no es una actividad) y dejaré que el método haga el resto. por favor, consejos cómo puedo lograr esto. gracias por su tiempo –

35

intentar algo como esto

public void writeData (String data) { 
     try { 
      FileOutputStream fOut = openFileOutput ("settings.dat" , MODE_WORLD_READABLE) ; 
      OutputStreamWriter osw = new OutputStreamWriter (fOut) ; 
      osw.write (data) ; 
      osw.flush () ; 
      osw.close () ; 
     } catch (Exception e) { 
      e.printStackTrace () ; 
     } 
    } 

    public String readSavedData () { 
     StringBuffer datax = new StringBuffer(""); 
     try { 
      FileInputStream fIn = openFileInput ("settings.dat") ; 
      InputStreamReader isr = new InputStreamReader (fIn) ; 
      BufferedReader buffreader = new BufferedReader (isr) ; 

      String readString = buffreader.readLine () ; 
      while (readString != null) { 
       datax.append(readString); 
       readString = buffreader.readLine () ; 
      } 

      isr.close () ; 
     } catch (IOException ioe) { 
      ioe.printStackTrace () ; 
     } 
     return datax.toString() ; 
    } 
+0

Creo que esta es una solución mejor que la otra respuesta. Si hay un archivo muy grande allí y no puede leer todo el archivo en la memoria, puede cambiar el tiempo para manejarlo una línea tras otra. La otra solución no es tan fácil de cambiar como esta. – rml

+0

Reemplazar 'datax = datax + readString;' con StringBuilder – marcinj

+0

¿Podría ser que exista un 'datax.append (System.lineSeparator());' missing? Y 'StringBuilder' es más eficiente que' StringBuffer', aparte de eso: Gracias, gran ayuda. – Martin

1

menos es más;

public class MainActivity extends AppCompatActivity { 

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

     TextView tvText = (TextView) findViewById(R.id.tvText); 

     try { 
      // Create File and Content 
      String FILE_NAME = "hallo.txt"; 
      String content = "Hallo Welt!"; 

      FileOutputStream fos = openFileOutput(FILE_NAME, MODE_PRIVATE); 
      fos.write(content.getBytes()); 
      fos.close(); 

      // Read File and Content 
      FileInputStream fin = openFileInput(FILE_NAME); 
      int size; 
      String neuText = null; 

      // read inside if it is not null (-1 means empty) 
      while ((size = fin.read()) != -1) { 
       // add & append content 
       neuText += Character.toString((char) size); 
      } 
      // Set text to TextView 
      tvText.setText(neuText); 

     } catch (Exception error) { 
      // Exception 
     } 
    } 
}