Recherche…


Introduction

La lecture et l'écriture de fichiers sous Android ne sont pas différentes de la lecture et de l'écriture de fichiers en Java standard. Même package java.io peut être utilisé. Cependant, il existe des éléments spécifiques liés aux dossiers que vous êtes autorisé à écrire, des autorisations en général et des solutions de contournement MTP.

Remarques

Android fournit des moyens pour partager le fichier entre plusieurs applications, comme indiqué ici . Cela n'est pas obligatoire si une seule application crée et utilise le fichier.

Android fournit des options de stockage alternatives telles que les préférences partagées et privées, les bundles enregistrés et la base de données intégrée. Dans certains cas, ils constituent un meilleur choix que l'utilisation de fichiers simples.

L'activité Android a peu de méthodes spécifiques qui ressemblent à des remplacements des méthodes File IO standard Java. Par exemple, au lieu de File.delete() vous pouvez appeler Context.deleteFile() et au lieu d’appliquer récursivement File.listFiles() vous pouvez appeler Context.fileList() pour obtenir la liste de tous les fichiers spécifiques de votre application avec un peu moins. code. Cependant, ils ne fournissent pas de fonctionnalités supplémentaires au-delà du package java.io standard.

Obtenir le dossier de travail

Vous pouvez obtenir votre dossier de travail en appelant la méthode getFilesDir() sur votre activité (Activity est la classe centrale de votre application qui hérite de Context. Voir ici ). La lecture n'est pas différente. Seule votre application aura accès à ce dossier.

Votre activité peut contenir le code suivant, par exemple:

  File myFolder = getFilesDir();
  File myFile = new File(myFolder, "myData.bin");

Écrire un tableau brut d'octets

  File myFile = new File(getFilesDir(), "myData.bin");
  FileOutputStream out = new FileOutputStream(myFile);

  // Write four bytes one two three four:
  out.write(new byte [] { 1, 2, 3, 4}
  out.close()

Il n'y a rien Android spécifique à ce code. Si vous écrivez souvent beaucoup de petites valeurs, utilisez BufferedOutputStream pour réduire l'usure du SSD interne du périphérique.

Sérialiser l'objet

L'ancienne sérialisation d'objet Java est disponible pour vous dans Android. vous pouvez définir des classes sérialisables comme:

  class Cirle implements Serializable {
    final int radius;
    final String name;

    Circle(int radius, int name) {
      this.radius = radius;
      this.name = name;
    }
  }

puis écrivez ensuite dans ObjectOutputStream:

  File myFile = new File(getFilesDir(), "myObjects.bin");
  FileOutputStream out = new FileOutputStream(myFile);
  ObjectOutputStream oout = new ObjectOutputStream(new BufferedOutputStream(out));

  oout.writeObject(new Circle(10, "One"));
  oout.writeObject(new Circle(12, "Two"));
  
  oout.close()

La sérialisation des objets Java peut être un choix parfait ou très mauvais, en fonction de ce que vous voulez en faire - en dehors de la portée de ce tutoriel et parfois des opinions. Lisez d'abord le contrôle de version si vous décidez de l'utiliser.

Ecriture sur stockage externe (carte SD)

Vous pouvez également lire et écrire depuis / vers une carte mémoire (carte SD) présente sur de nombreux appareils Android. Les fichiers de cet emplacement sont accessibles par d'autres programmes, également directement par l'utilisateur après la connexion du périphérique au PC via le câble USB et l'activation du protocole MTP.

La localisation de la carte SD est un peu plus problématique. La classe Environment contient des méthodes statiques pour obtenir des "répertoires externes" qui devraient normalement se trouver dans la carte SD, également des informations si la carte SD existe et est accessible en écriture. Cette question contient des réponses précieuses sur la manière de s’assurer que le bon emplacement sera trouvé.

L'accès au stockage externe nécessite des autorisations dans votre manifeste Android:

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

Pour les anciennes versions d'Android, il est suffisant de placer ces autorisations dans un manifeste (l'utilisateur doit approuver lors de l'installation). Toutefois, à partir d'Android 6.0, Android demande l'approbation de l'utilisateur au moment du premier accès, et vous devez prendre en charge cette nouvelle approche. Sinon, l'accès est refusé quel que soit votre manifeste.

Dans Android 6.0, vous devez d’abord vérifier l’autorisation, puis, s’il n’est pas accordé, le demander. Les exemples de code se trouvent dans cette question SO .

Résoudre le problème "Invisible MTP files".

Si vous créez des fichiers à exporter via un câble USB vers un ordinateur de bureau à l'aide du protocole MTP, il se peut que les nouveaux fichiers créés ne soient pas immédiatement visibles dans l'explorateur de fichiers exécuté sur le PC de bureau connecté. Pour rendre les nouveaux fichiers visibles, vous devez appeler MediaScannerConnection :

File file = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_DOCUMENTS), "theDocument.txt");
FileOutputStream out = new FileOutputStream(file)

... (write the document)

out.close()
MediaScannerConnection.scanFile(this, new String[] {file.getPath()}, null, null);
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
            Uri.fromFile(file)));

Ce code d'appel MediaScannerConnection fonctionne uniquement pour les fichiers, pas pour les répertoires. Le problème est décrit dans ce rapport de bogue sur Android . Cela peut être corrigé pour une version future ou sur certains appareils.

Travailler avec de gros fichiers

Les petits fichiers sont traités en une fraction de seconde et vous pouvez les lire / écrire à la place du code où vous en avez besoin. Cependant, si le fichier est plus gros ou plus lent à traiter, vous devrez peut-être utiliser AsyncTask dans Android pour utiliser le fichier en arrière-plan:

    class FileOperation extends AsyncTask<String, Void, File> {

        @Override
        protected File doInBackground(String... params) {
          try {
            File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOCUMENTS), "bigAndComplexDocument.odf");
            FileOutputStream out = new FileOutputStream(file)

           ... (write the document)

            out.close()
            return file;
            } catch (IOException ex) {
               Log.e("Unable to write", ex);
               return null;
              }
        }

        @Override
        protected void onPostExecute(File result) {
          // This is called when we finish 
        }

        @Override
        protected void onPreExecute() {
           // This is called before we begin
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            // Unlikely required for this example
        }
    }
}

et alors

new FileOperation().execute("Some parameters");    

Cette question SO contient l'exemple complet sur la façon de créer et d'appeler AsyncTask. Consultez également la question sur la gestion des erreurs pour gérer les exceptions IOExceptions et autres erreurs.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow