TP4 : Stockage de données
Objectifs du TP
Ce TP a pour objectif de vous initier au stockage des données dans un téléphone Android, dans la mémoire interne et dans une carte de stockage externe.
I. Stockage des données dans la mémoire interne
Une application peut stocker ses données dans la mémoire interne du téléphone. Par défaut, ces données sont privées, c'est-à-dire qu'elles ne sont pas accessibles depuis d'autres applications. À la suppression de l'application, ces données sont supprimées.
Pour chaque application, le système Android crée un répertoire nommé : « /data/data/package_de_l’application ». Les fichiers internes sont stockés dans le sous-répertoire files.
I.1. Lecture et écriture des données à partir d’un fichier
Les primitives Java pour la manipulation des fichiers se déclinent en deux catégories principales : celles pour la lecture et celles pour l’écriture.
I.1.1. Primitives de lecture
Il existe deux types de primitives de lecture : InputStream et Reader. Ces deux classes permettent de lire un flux de données depuis une source en entrée, mais avec une différence majeure :
- InputStream lit un flux d’octets.
- Reader lit un flux de caractères.
À partir d’un InputStream, il est possible de créer un Reader en utilisant la classe InputStreamReader. Pour faciliter la gestion des flux, on utilise souvent un BufferedReader, qui améliore l’efficacité des opérations avec des méthodes comme readLine().
I.1.2. Primitives d’écriture
Les primitives duales à celles de lecture sont : OutputStreamWriter, FileWriter et BufferedWriter. Ces classes permettent d’écrire des flux de caractères dans un fichier.
I.2. Création ou modification d’un fichier
Pour créer ou modifier un fichier, utilisez la méthode openFileOutput. Spécifiez le nom du fichier et son mode d’ouverture :
- MODE_PRIVATE : Le fichier est accessible uniquement par l’application qui l’a créé.
- MODE_WORLD_READABLE : Le fichier est accessible en lecture par d’autres applications.
- MODE_WORLD_WRITEABLE : Le fichier est accessible en écriture par d’autres applications.
- MODE_APPEND : Si le fichier existe déjà, les nouvelles données sont ajoutées à la fin.
Exemple de code pour stocker une chaîne en mode privé :
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(openFileOutput("saisie.txt", Context.MODE_PRIVATE)));
bw.write("chaine_a_ecrire");
bw.close();
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
I.3. Lecture du contenu d’un fichier
Pour lire le contenu d’un fichier et le stocker dans une chaîne, utilisez le code suivant :
try {
BufferedReader br = new BufferedReader(new InputStreamReader(openFileInput("saisie.txt")));
String line;
StringBuffer buffer = new StringBuffer();
while ((line = br.readLine()) != null) {
buffer.append(line);
}
br.close();
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
I.4. Accès au fichier depuis une autre application
Pour accéder à un fichier créé par une autre application, il faut utiliser createPackageContext suivi de openFileOutput ou openFileInput, en précisant le nom du package de l’application source.
Exemple : Si le fichier saisie.txt appartient au package com.example.stockage, utilisez :
createPackageContext("com.example.stockage", 0).openFileOutput("saisie.txt")
II. Stockage des données dans une mémoire externe
Android permet d’accéder à un stockage externe (comme une carte SD). Les fichiers et répertoires de ce stockage sont accessibles en lecture par toutes les applications.
II.1. Accès et modification du support de stockage externe
Pour visualiser le contenu de la carte SD avec Eclipse, utilisez la perspective DDMS (Dalvik Debug Monitor Server) :
- Allez dans Window puis Open Perspective puis Other...
- Sélectionnez DDMS et cliquez sur OK.
- Dans File Explorer, accédez au répertoire mnt/sdcard pour voir le contenu de la carte SD.
- Pour ajouter un fichier, sélectionnez le répertoire sdcard et utilisez le bouton Pull a file from the device.
- Pour télécharger un fichier, utilisez le bouton Push a file to the device.
Pour revenir à la perspective Java, cliquez sur l’icône de retour à la perspective précédente.
II.2. Tester le support de stockage externe
Pour vérifier si le stockage externe est accessible en lecture et écriture, utilisez la méthode Environment.getExternalStorageState() et comparez avec les constantes suivantes :
- Environment.MEDIA_MOUNTED : Le stockage est accessible en lecture et écriture.
- Environment.MEDIA_MOUNTED_READ_ONLY : Le stockage est accessible uniquement en lecture.
Exemple de code pour tester l’état du stockage :
boolean stockageExiste = false;
boolean stockageEcriture = false;
String état = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(etat)) {
stockageExiste = stockageEcriture = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(etat)) {
stockageExiste = true;
stockageEcriture = false;
} else {
stockageExiste = stockageEcriture = false;
}
II.3. Lecture d’un fichier dans le stockage externe
Pour accéder à un fichier dans un stockage externe, utilisez le code suivant :
File directory = Environment.getExternalStorageDirectory();
File file = new File(directory + "/chaine.txt");
if (!file.exists()) {
Toast.makeText(this, "Fichier n’existe pas dans la carte SD", Toast.LENGTH_LONG).show();
} else {
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
StringBuffer buffer = new StringBuffer();
while ((line = br.readLine()) != null) {
buffer.append(line);
}
br.close();
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
II.4. Création ou modification d’un fichier dans un stockage externe
Pour modifier un fichier dans le stockage externe, ajoutez la permission WRITE_EXTERNAL_STORAGE dans le fichier AndroidManifest.xml :
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Utilisez ensuite le code suivant pour écrire dans un fichier externe :
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
bw.write("chaine_a_ecrire");
bw.close();
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
Pour ajouter une chaîne à la fin du fichier, utilisez :
BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
III. Travail à faire (Homework)
Créez deux applications partageant un fichier resultat.txt dans la carte SD :
- SommeFichiers : Contient un champ de saisie txt et deux boutons ajouter et afficherListe.
- Saisissez un entier via le champ txt.
- Au clic sur ajouter :
- Ajoutez l’entier saisi à la fin d’un fichier interne entiers.txt (séparé par une virgule).
- Lisez le fichier resultat.txt.
- Si le fichier est vide ou n’existe pas, créez-le et stockez l’entier saisi.
- Sinon, calculez la somme de l’entier existant dans resultat.txt avec celui saisi, puis stockez le résultat (en écrasant l’ancienne valeur).
- Au clic sur afficherListe, affichez le contenu du fichier entiers.txt dans un Toast.
- VerifierFichiers : Contient deux boutons afficherListe et afficherResultat.
- Au clic sur afficherListe, affichez le contenu du fichier entiers.txt dans un Toast.
- Au clic sur afficherResultat, affichez le contenu du fichier resultat.txt dans un Toast.
FAQ
Comment convertir une chaîne en entier en Java ?
Utilisez la méthode Integer.valueOf(chaine).
Comment ajouter une chaîne à la fin d’un fichier externe ?
Utilisez new FileWriter(file, true) pour ouvrir le fichier en mode append.
Quels sont les modes de stockage disponibles dans openFileOutput ?
Les modes sont : MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE et MODE_APPEND.