Création de fichiers temporaires dans Android

205

Quelle est la meilleure façon de créer un fichier temporaire dans Android?

File.createTempFile peut- il être utilisé? La documentation est très vague à ce sujet.

En particulier, il n'est pas clair si les fichiers temporaires créés avec File.createTempFilesont supprimés, si jamais.

hpique
la source
Vous pouvez commencer avec ce fil dans stackoverflow, où les fichiers temporaires sont discutés.
Benny Skogberg
Cette discussion de groupe Google Developers Android pourrait être intéressante: groups.google.com/group/android-developers/browse_thread/thread/…
hpique

Réponses:

287

Voici ce que je fais généralement:

File outputDir = context.getCacheDir(); // context being the Activity pointer
File outputFile = File.createTempFile("prefix", "extension", outputDir);

Quant à leur suppression, je ne suis pas sûr non plus. Étant donné que j'utilise ceci dans mon implémentation d'un cache, je supprime manuellement les fichiers les plus anciens jusqu'à ce que la taille du répertoire du cache se résume à ma valeur prédéfinie.

sparkymat
la source
2
C'est ce que je fais aussi. Mon hypothèse est que createTempFile ne crée pas de vrais fichiers temporaires sauf s'il utilise le répertoire cache, mais cela n'est pas vraiment documenté.
hpique
puis-je supposer que le fichier restera aussi longtemps que l'application est en cours d'exécution, même si d'autres applications s'exécutent également et créent leurs propres fichiers temporaires?
développeur Android
1
Chaque application utilise son propre cache: par défaut, les fichiers enregistrés dans le stockage interne sont privés de votre application et les autres applications ne peuvent pas y accéder (ni l'utilisateur). Si vous souhaitez mettre en cache certaines données, vous devez utiliser getCacheDir () pour ouvrir un fichier dans lequel votre application doit enregistrer les fichiers de cache temporaires. Lorsque l'appareil manque d'espace de stockage interne, Android peut supprimer ces fichiers de cache pour récupérer de l'espace. Cependant, vous ne devez pas compter sur le système pour nettoyer ces fichiers à votre place. Source
felixd
Puis-je utiliser l'intention de partage pour partager ce fichier?
demandé le
4
Vous pouvez appeler outputFile.deleteOnExit (). En théorie, le système le nettoiera à la fermeture de votre application. Méthode standard dans la classe File.
Dave Hubbard
90

Meilleures pratiques sur les fichiers temporaires internes et externes :

Cache interne

Si vous souhaitez mettre en cache certaines données, plutôt que de les stocker de manière persistante, vous devez utiliser getCacheDir()pour ouvrir un fichier qui représente le répertoire interne où votre application doit enregistrer les fichiers de cache temporaires.

Lorsque l'appareil manque d'espace de stockage interne, Android peut supprimer ces fichiers de cache pour récupérer de l'espace. Cependant, vous ne devez pas compter sur le système pour nettoyer ces fichiers à votre place. Vous devez toujours gérer les fichiers de cache vous-même et rester dans une limite raisonnable d'espace consommé, comme 1 Mo. Lorsque l'utilisateur désinstalle votre application, ces fichiers sont supprimés.

Cache externe

Pour ouvrir un fichier qui représente le répertoire de stockage externe dans lequel vous devez enregistrer les fichiers de cache, appelez getExternalCacheDir(). Si l'utilisateur désinstalle votre application, ces fichiers seront automatiquement supprimés.

Semblable à ContextCompat.getExternalFilesDirs(), mentionné ci-dessus, vous pouvez également accéder à un répertoire de cache sur un stockage externe secondaire (si disponible) en appelant ContextCompat.getExternalCacheDirs().

Conseil: Pour préserver l'espace des fichiers et maintenir les performances de votre application, il est important de gérer soigneusement vos fichiers de cache et de supprimer ceux qui ne sont plus nécessaires tout au long du cycle de vie de votre application.

mibollma
la source
2
Cela ne répond pas adéquatement à la question de savoir quoi faire avec les gros fichiers temporaires. Quelle est la meilleure pratique ici? Je soupçonne qu'il n'y en a pas d'autre que la simple gestion d'un fichier normal.
Merk
35

Pour les fichiers internes temporaires, il existe 2 options

1.

File file; 
file = File.createTempFile(filename, null, this.getCacheDir());

2.

File file
file = new File(this.getCacheDir(), filename);

Les deux options ajoutent des fichiers dans le répertoire de cache des applications et peuvent donc être effacées pour libérer de l'espace, mais l'option 1 ajoutera un nombre aléatoire à la fin du nom de fichier pour conserver les fichiers uniques. Il ajoutera également une extension de fichier qui est .tmppar défaut, mais elle peut être réglée sur n'importe quoi via l'utilisation du 2ème paramètre. L'utilisation du nombre aléatoire signifie qu'en dépit de la spécification d'un nom de fichier, il ne reste pas le même que le nombre est ajouté avec l'extension / l'extension de fichier ( .tmppar défaut), par exemple, vous spécifiez votre nom de fichier comme internal_fileet apparaît comme internal_file1456345.tmp. Alors que vous pouvez spécifier l'extension, vous ne pouvez pas spécifier le numéro qui est ajouté. Vous pouvez cependant trouver le nom de fichier qu'il génère viafile.getName(); , mais vous devrez stockez-le quelque part afin de pouvoir l'utiliser quand vous le souhaitez, par exemple pour supprimer ou lire le fichier. Par conséquent, pour cette raison, je préfère la 2e option car le nom de fichier que vous spécifiez est le nom de fichier qui est créé.

AdrenalineJunky
la source
2
Puis-je supposer que les fichiers temporaires ne seront supprimés que lorsque le processus de l'application n'est pas actif?
développeur android
2
@androiddeveloper No.
Guilherme Bernal
@GuilhermeBernal Comment savez-vous cela? L'avez-vous vu supprimé?
développeur Android
1
@androiddeveloper Désolé de ne pas avoir donné de détails plus tôt. Un utilisateur peut ouvrir l'application, puis accéder aux paramètres, vider son cache et revenir à l'application, le tout sans le faire tuer. Une application ne peut donc pas supposer que le fichier cache ne sera pas supprimé et rien n'empêche Android de le faire sans interaction de l'utilisateur.
Guilherme Bernal
14

Vous pouvez utiliser le répertoire cache en utilisant context.getCacheDir () .

File temp=File.createTempFile("prefix","suffix",context.getCacheDir());
Macarse
la source
10
File temp = File.createTempFile ("prefix", "suffix", context.getCacheDir ());
Patrick
Merci, je l'ai fait, mais ma taille de fichier est égale à 0B, où est le problème, des idées?
user7856586
1

Vous pouvez utiliser la File.deleteOnExit()méthode

https://developer.android.com/reference/java/io/File.html#deleteOnExit ()

Il est référencé ici https://developer.android.com/reference/java/io/File.html#createTempFile(java.lang.String , java.lang.String, java.io.File)

kotucz
la source
7
Il est à peu près inutile sur Android en raison de la saveur étrange machine virtuelle Java utilisée (il est fin presque jamais normalement)
weaknespase
1
Tant qu'il n'y a pas de problèmes de performances, supprimez, libérez ou supprimez des données immédiatement, lorsque vous n'en avez plus besoin.
Redwolf
0

Faites-le en toute simplicité. Selon la documentation https://developer.android.com/training/data-storage/files

String imageName = "IMG_" + String.valueOf(System.currentTimeMillis()) +".jpg";
        picFile = new File(ProfileActivity.this.getCacheDir(),imageName);

et supprimez-le après utilisation

picFile.delete()
Shivam Dawar
la source