web-dev-qa-db-fra.com

Comment lire / écrire une chaîne à partir d'un fichier dans Android

Je veux enregistrer un fichier dans la mémoire interne en récupérant le texte saisi depuis EditText. Ensuite, je veux que le même fichier retourne le texte saisi sous forme de chaîne et l'enregistre dans une autre chaîne qui sera utilisée ultérieurement.

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 à analyser plus en détail mes points quant à l'endroit où je veux que les opérations soient effectuées/les variables à utiliser.

174
Major Aly

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

Écrire un fichier:

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

Lire le fichier:

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

Pour ceux qui recherchent une stratégie générale pour lire et écrire une chaîne dans un fichier:

D'abord, obtenez un objet fichier

Vous aurez besoin du chemin de stockage. Pour le stockage interne, utilisez:

File path = context.getFilesDir();

Pour le stockage externe (carte SD), utilisez:

File path = context.getExternalFilesDir(null);

Ensuite, créez votre objet de fichier:

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 Guava

Contenu de la chaîne = Files.toString (fichier, StandardCharsets.UTF_8);

Lire le fichier dans 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 Guava

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

Pour être complet, je mentionnerai

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

qui ne nécessite aucune bibliothèque, mais des points de repère de 50% à 400% plus lents que les autres options (dans divers tests sur mon Nexus 5).

Notes

Pour chacune de ces stratégies, il vous sera demandé d'attraper une exception IOException.

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

Si vous utilisez un stockage externe, vous devez ajouter à votre manifeste soit:

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

ou

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

La permission d'écriture implique la permission de lecture, vous n'avez donc pas besoin des deux.

162
SharkAlley
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();
}
31
Eugene

Juste quelques modifications sur la lecture de chaîne à partir d'une méthode de fichier pour plus de performance

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;
}
7
Tai Le Anh

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.

5
Raj

Je suis un peu débutant et j'ai du mal à faire en sorte que cela fonctionne aujourd'hui.

Vous trouverez ci-dessous le cours auquel j'ai abouti. Cela fonctionne mais je me demandais si ma solution était imparfaite. Quoi qu'il en soit, j'espérais que certains d'entre vous, plus expérimentés, seraient disposés à consulter ma classe IO et à me donner des conseils. À votre santé!

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