• 26juin

    Ecrire et lire dans un fichier avec android



    Dans ce tuto je vais développer des méthodes me permettant de lire et écrire dans un fichier android. Pour faire cela je vais utiliser les class FileOutputStream, OutputStreamWriter pour l’écriture et les classes FileInputStream , InputStreamReader pour la lecture. J’utilise également la class Toast pour afficher des popups surgissant

    D’abord ma méthode me permettant d’écrire dans un fichier

    ?Download download.txt
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
      public void WriteSettings(Context context, String data){ 
            FileOutputStream fOut = null; 
            OutputStreamWriter osw = null; 
     
            try{ 
               fOut = context.openFileOutput("settings.dat",MODE_APPEND);       
                osw = new OutputStreamWriter(fOut); 
                osw.write(data); 
                osw.flush(); 
               //popup surgissant pour le résultat
                Toast.makeText(context, "Settings saved",Toast.LENGTH_SHORT).show(); 
                } 
                catch (Exception e) {       
                        Toast.makeText(context, "Settings not saved",Toast.LENGTH_SHORT).show(); 
                } 
                finally { 
                   try { 
                          osw.close(); 
                          fOut.close(); 
                          } catch (IOException e) { 
                                   Toast.makeText(context, "Settings not saved",Toast.LENGTH_SHORT).show(); 
                          } 
                } 
           }

    Ma méthode me permettant de lire dans mon fichier et de renvoyer le contenu sous forme de String (chaine de caractères) .

    ?Download download.txt
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    public String ReadSettings(Context context){ 
            FileInputStream fIn = null; 
            InputStreamReader isr = null; 
     
            char[] inputBuffer = new char[255]; 
            String data = null; 
     
            try{ 
             fIn = context.openFileInput("settings.dat");       
                isr = new InputStreamReader(fIn); 
                isr.read(inputBuffer); 
                data = new String(inputBuffer); 
               //affiche le contenu de mon fichier dans un popup surgissant
                Toast.makeText(context, " "+data,Toast.LENGTH_SHORT).show(); 
                } 
                catch (Exception e) {       
                          Toast.makeText(context, "Settings not read",Toast.LENGTH_SHORT).show(); 
                } 
                /*finally { 
                   try { 
                          isr.close(); 
                          fIn.close(); 
                          } catch (IOException e) { 
                            Toast.makeText(context, "Settings not read",Toast.LENGTH_SHORT).show(); 
                          } 
                } */
                return data; 
           }

    Pour tester ces deux méthodes je vais créer une fenêtre avec un bouton écrire, un bouton lire et une zone de saisie.
    le fichier xml de ma fenêtre test.xml

    ?Download download.txt
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="fill_parent" 
                  android:layout_height="fill_parent" 
                  android:orientation="vertical" >
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
     
    	<Button android:id="@+id/btecrire"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Ecrire" />
       <Button android:id="@+id/btvoir"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="voir" />
        <EditText  
    	android:id="@+id/text"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Ingredient"
        android:background="#D4D0C8"
        android:textColor="#000000"
        />
     
        <TextView android:id="@+id/text"
                  android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:text=""  />
     
    </LinearLayout> 
    </ScrollView>

    Je rajoute le code suivant, me permettant d’afficher ma fenêtre de test.xml et tester mes méthodes sur le click de mes différents boutons

    ?Download download.txt
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    setContentView(R.layout.test);
     Button btvoir = (Button) findViewById(R.id.btvoir);
     Button btecrire = (Button) findViewById(R.id.btecrire);
     btvoir.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
     
                  ReadSettings(lecontext);
         } 
         });  
     
    btecrire.setOnClickListener(new Button.OnClickListener() {
             public void onClick(View v) {
              TextView datatext = (TextView) findViewById(R.id.text);
             String sQuantite = datatext.getText()+"\n";
             WriteSettings(lecontext,sQuantite);
       } 
      });

    Résultat
    lireecrire1 lireecrire2

    Il est temps de mettre à profit les tutoriels d’Android France:
    Passez à la vitesse supérieure et investissez quelques dizaines d’euros pour acquérir les connaissances qui vous feront gagner de l’argent avec vos applications rendez-vous sur notre boutique Android-france pour ces formations en vidéo

    Co-fondateur du site Android france, senior lead developper, passionné de bière et de cigare cubain

    Twitter Google+ 

  • Agathe

    Bonjour,

    merci pour cet excellent tuto, ils ne sont pas nombreux sur le sujet !

    par contre je bloque sur un point : « lecontext », qu’es ce que c’est que cette variable, où faut-il la définir et que représente-t-elle ?

    merci d’avance pour votre éclairage…

  • Quintana

    Salut,

    Moi j’ai rajouté :

    Context lecontext=getBaseContext();

    Sylvain

  • kref

    une fois le fichier crée, il se trouve où ? (depuis l’émulateur)

    • kookitanou

      data > data > your app id > files

  • ColletJb

    Dans « ReadSettings », ligne 19-26, pourquoi est-ce commenté ?

    Il faut normalement bien fermer les fichiers et flux ouverts préalablement…

  • Doudou

    J’ai la même question que kref ! A quel endroit dans le projet Android doit se trouver ce fichier qu’on charge avec openFileInput et openFileOutput ?

  • Guy

    @Doudou @kref vous retrouverez ces fichiers dans le répertoire asset de votre projet sout eclipse

  • BInouSE

    Bonjour,

    Merci pour ce petit tuto qui m’a beaucoup aidé dans mon projet.

    Je voudrais tester l’existence du fichier « settings.dat » à l’ouverture de mon programme pour savoir si je peux le lire.
    Je pensais utiliser la méthode « File.exist() » mais je ne parviens pas trouver le fichier en question. Je pense qu’il faudrait lui indiquer le chemin exact mais quel est-il ?

    Pourriez m’indiquer le chemin du fichier ou une autre méthode pour savoir s’il existe ?

  • Boiz

    Bonjour,

    J’ai testé la méthode pour écrire dans le fichier settings.dat
    Le problème que je rencontre est qu’il n’y a aucun bug mais le fichier n’est pas créé (le code s’exécute bien après vérification avec le débogueur)
    Est ce que quelqu’un à déjà rencontré ce problème?

    Merci

  • Gon23

    En complément de ce très bonne article vu que la question as été posé plusieurs fois

    par défaut le fichier ce trouve dans data/data//files/

    pour tester l’existence du fichier si on a pas modifier le répertoire par défaut on peut faire :

    #
    # File tmp = new File(context.getFilesDir() + « / » + sFile);
    # tmp.exists()
    #

    PS : je ne sais pas si cette méthode est la plus optimisée mais elle a le mérite d’être fonctionnelle et encore bravo pour l’article.

  • Gon23

    oups petite erreur dsl.

    data/data/{aplivation}/files/

  • Freddy

    Bonjour,

    J’ai utilisé ce code pour réaliser une application de saisie.
    Les infos sont donc écrites dans un fichier setting.dat
    initialement j’utilisais l’émulateur en 2.3.
    Je viens d’acheter un archos 5 et j’ai donc créer un autre projet en android 1.6 pour que ce soit compatible avec l’archos.

    J’ai testé l’application sur l’archos et ça m’indique que les données sont écrites (correspondant au message « Settings saved » ligne 11 de la procédure d’écriture ci-dessus).
    Dans l’archos, je ne trouve pas le fichier setting.dat correspondant.

    Dans l’émulateur android 2.3 je le trouvais dans data/data/nom_application/files comme plusieurs l’on précisé ici.
    Dans l’archos, je ne le trouve pas, même si je crée les différents répertoires avant de tester de nouveau l’application.

    Pourriez-vous m’aider ?

    (je débute complètement)
    Freddy

  • Freddy

    Au fait, bon réveillon à tous !

    Freddy

  • Freddy

    Gon 23,

    Je viens de relire ton post.

    Comment fait-on pour changer le répertoire par défaut ?

    Freddy

  • Freddy

    Encore une question :

    lorsque je lance mon application avec la version 1.6 de l’émulateur, je n’arrive pas à accéder au répertoire data/data/…..

    lorsque je vais dans DDMS/file explorer, je clic sur le « + » de data pour ouvrir le dossier, l’arborescence disparait alors et pas moyen d’aller cherche le fichier qui a été écrit.

    Ca marchait très bien avec l’émulateur en version 2.3

    Savez-vous me dépanner ?

    Freddy

  • Freddy

    Bonjour,

    Encore un commentaire sur le sujet de trouver un fichier écrit dans l’archos5.

    J’ai fais afficher le chemin du fichier écrit. Le comble c’est que c’est le fameux « /data/data/ nom application / files/ » qui s’inscrit mais je n’arrive toujours pas à le trouver.

    Lorsque je le cherche, j’utilise l’explorateur d’origine : il affiche 2 arborescences dans un écran partagé avec « Archos 5″ en entête de chacun de ces arborescence.

    Je comprend donc que je vois la racine et donc que le répertoire data que je vois est le premier « /data/ »

    Bref, la seule conclusion à laquelle je suis arrivé est qu’il y aurait des fichiers et répertoires cachés dans l’archos mais je n’ai rien trouvé à ce sujet (y compris dans les options de l’archos).

  • olivier

    Salut,
    merci pour ce super tuto.
    j’arrive à compiler l’appli sans pb.
    Par contre ça plante dès que je veux écrire ou lire en utilisant les boutons. Est-ce que je dois préciser certaines permissions dans le AndroidManifest.xml ?

    et si oui lesquelles ?

    merci
    Olivier

  • Jazys

    Bonjour,

    J’ai exactement le même problème que toi Freddy, j’ai essayé avec un samsung et l’enregistrement du fichier se fait bien mais impossible de le lire.
    Si tu as solutionné ton problème, merci de m’indiquer la marche à suivre

  • Freddy

    Bonsoir,

    Je n’ai pas solutionné le problème complètement, car j’ai travaillé sur d’autres aspect du programme depuis et j’ai aussi relâché un peu.
    Il faut que je le finisse !

    J’arrivais à lire le fichier via la fonction « ReadSettings ».
    Ce que je n’arrive pas à voir, c’est le fichier lui-même dans l’arborescence des fichiers de l’archos.

    J’ai trouvé une autre manière d’écrire et lire un fichier, avec cette fois le fichier visible dans l’explorer de fichiers :

    http://www.developpez.net/forums/d976676/java/general-java/java-mobiles/android/peux-creer-fichier-texte-sd-card/

    ceci peut t’aider :
    http://www.pointgphone.com/forum/post16465

    Freddy

  • Bribri

    Bonjour,

    J’ai une tablette A500 et lorsque je fait ce code, je ne trouve pas le fichier dans l’explorateur (ASTRO). Alors que je l’ai bien dans l’émulateur sur mon pc. Je n’ai pas non plus le dossier com.application…. dans mon dossier Android/data sur ma tablette. Est-ce normal?

    Merci

    Bribri

  • David

    Merci bcp pour le tuto!!!

  • statis

    Salut à tous,

    Vraiment bien le tuto.
    Mais pour moi inutilisable…
    Je suis débutant, je sais utiliser eclipse pour creer un main xml, l’activity java mais quand j’essaye de coller les portions écrire+lire+affichage, j’ai plein d’erreurs…
    Pour les imports eclipse aide bien mais pour tous les public void j’ai une erreur, idem pour public string, return data; et bien sûr les définitions de boutons.

    Quelqu’un d’entre vous aurait-il la possibilité d’afficher le tuto complet de bout en bout ?
    Cà serait super sympa pour les débutants.

    Merci à tous

  • tbn

    s’il vous palit j’aimerai bien qu’avec ce meme fichier je puisse l’envoyer a un serveur aidez s’il vous plait

  • tupakito

    Bonsoir,

    Pour ceux qui n’aurais toujours pas réussi à compiler le code, voici ce que j’ai fait (si il y a des améliorations à faire, informez moi en ;) )

    package com.test.projet;

    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.widget.TextView;
    import android.widget.Toast;
    import java.io.FileOutputStream;
    import java.io.OutputStreamWriter;
    import java.io.InputStreamReader;
    import java.io.FileInputStream;
    import android.content.Context;
    import java.io.IOException;
    import android.widget.Button;
    import android.view.View;

    public class MainActivity extends Activity {

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

    Button btvoir = (Button) findViewById(R.id.btvoir);
    Button btecrire = (Button) findViewById(R.id.btecrire);

    btvoir.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
    Context lecontext = getBaseContext();
    ReadSettings(lecontext);
    }
    });

    btecrire.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
    TextView datatext = (TextView) findViewById(R.id.text);
    String sQuantite = datatext.getText()+ »\n »;
    Context lecontext = getBaseContext();
    WriteSettings(lecontext,sQuantite);
    }
    });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
    }

    public void WriteSettings(Context context, String data){
    FileOutputStream fOut = null;
    OutputStreamWriter osw = null;

    try{
    fOut = context.openFileOutput(« settings.dat »,MODE_APPEND);
    osw = new OutputStreamWriter(fOut);
    osw.write(data);
    osw.flush();
    //popup surgissant pour le résultat
    Toast.makeText(context, « Settings saved »,Toast.LENGTH_SHORT).show();
    }
    catch (Exception e) {
    Toast.makeText(context, « Settings not saved »,Toast.LENGTH_SHORT).show();
    }
    finally {
    try {
    osw.close();
    fOut.close();
    } catch (IOException e) {
    Toast.makeText(context, « Settings not saved »,Toast.LENGTH_SHORT).show();
    }
    }
    }

    public String ReadSettings(Context context){
    FileInputStream fIn = null;
    InputStreamReader isr = null;

    char[] inputBuffer = new char[255];
    String data = null;

    try{
    fIn = context.openFileInput(« settings.dat »);
    isr = new InputStreamReader(fIn);
    isr.read(inputBuffer);
    data = new String(inputBuffer);
    //affiche le contenu de mon fichier dans un popup surgissant
    Toast.makeText(context,  » « +data,Toast.LENGTH_SHORT).show();
    }
    catch (Exception e) {
    Toast.makeText(context, « Settings not read »,Toast.LENGTH_SHORT).show();
    }
    /*finally {
    try {
    isr.close();
    fIn.close();
    } catch (IOException e) {
    Toast.makeText(context, « Settings not read »,Toast.LENGTH_SHORT).show();
    }
    } */
    return data;
    }

    }

    Cordialement :)