252 votes

Comment lire / écrire des chaînes à partir d'un fichier sous Android

J'ai cherché et suis passé par la plupart des questions ici, aucun n'a semblé résoudre ma situation.

Je veux enregistrer un fichier de la mémoire de stockage interne par l'obtention de texte saisi à partir de EditText. Ensuite, je veux le même fichier pour revenir à la saisie de texte dans la forme d'une Chaîne et en enregistrer une autre Chaîne de caractères qui sera utilisée plus tard.

Voici le code:

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

J'ai inclus des commentaires pour vous aider à mieux analyser mes points où je veux les opérations à faire/les variables à utiliser.

383voto

R9J Points 1378

J'espère que cela pourrait vous être utile.

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


private String readFromFile() {

    String ret = "";

    try {
        InputStream inputStream = 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;
}
 

218voto

SharkAlley Points 2239

Pour ceux qui recherchent une stratégie générale pour la lecture et l'écriture d'une chaîne de caractères dans un fichier:

Tout d'abord, obtenir un objet de fichier

Vous aurez besoin de l'emplacement de stockage. Pour le stockage interne, utilisez:

String path = context.getFilesDir().getAbsolutePath();

Pour le stockage externe (carte SD), utilisez:

String path = context.getExternalFilesDir(null).getAbsolutePath();

Ensuite, créez votre fichier de l'objet:

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

Écrire une chaîne dans le fichier

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

Ou avec Google Goyave

Files.write("text-to-write", file, "UTF-8");

Lire le fichier en une chaîne

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

Ou, si vous utilisez Google Goyave

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

Pour être complet, je vais vous parler de

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

qui ne nécessite pas de bibliothèques, mais les repères de 50% - 400% plus lent que les autres options (dans les différents tests sur mon Nexus 5).

Notes

Pour chacune de ces stratégies, vous serez invité à attraper une IOException.

Le codage de caractères par défaut sur Android est l'UTF-8.

Si vous utilisez le stockage externe, vous devez l'ajouter à votre manifeste, soit:

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

ou

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

L'autorisation d'écriture implique l'autorisation de lecture, de sorte que vous n'avez pas besoin de les deux.

45voto

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

7voto

Raj Points 1030

vérifiez le code ci-dessous.

Lecture d'un fichier dans le système de fichiers.

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

code ci-dessous est d'écrire le fichier dans le système de fichiers interne.

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

Je crois que ceci vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X