web-dev-qa-db-fra.com

File.createTempFile () VS new File ()

Dans mon application, j'ai ajouté la possibilité d'ajouter et d'enregistrer des images pour la journée, représentées par un Fragment.

Afin de sauvegarder l'image sur la carte SD, j'utilise actuellement la fonction File.createTempFile:

File imageFile = File.createTempFile(imageFileName, MyApplication.JPEG_FILE_SUFFIX, MyApplication.getAlbumDir());

En fait, j'ai également essayé avec la méthode standard:

File imageFile = new File(MyApplication.getAlbumDir(), imageFileName + MyApplication.JPEG_FILE_SUFFIX);

Les deux fonctionnent, mais dans mon cas, le premier est meilleur que le second car la fonction createTempFile ajoute un long nombre aléatoire à la fin du nom de fichier, ce qui le rend unique.

Pour vous donner un exemple, voici ce que j'obtiens avec les deux méthodes:

Avec createTempFile: IMG_2013-06-18_-1961144729.jpg

Avec nouveau fichier: IMG_2013-06-18_.jpg

Enfin ma question est, est-il sûr de continuer à utiliser createTempFile pour enregistrer mes photos ou dois-je utiliser la méthode standard et ajouter du code pour générer un nom de fichier unique? Doit-il être utilisé uniquement pour les fichiers temporaires?

J'ai examiné la documentation sur la fonction mais je n'ai rien trouvé sur les conséquences possibles de son utilisation au lieu de new File.

Merci

47
Yoann Hercouet

On dirait que votre application crée des fichiers, vous devez donc garantir des noms de fichiers uniques. Vous pouvez conserver une sorte de compteur dans votre application (enregistré dans les préférences ou la base de données) et l'utiliser. Ensuite, vous pouvez créer des noms plus courts/plus contrôlés et contrôler vous-même l'unicité. Ou vous pouvez utiliser createTempFile (), ce qui vous garantira un nom de fichier unique (mais vous n'obtiendrez qu'un contrôle partiel du nom de fichier). On dirait que vous préférez createTempFile (), il n'y a donc aucune raison de ne pas continuer à l'utiliser si vous êtes satisfait des noms de fichiers qu'il génère. Il n'y a pas d'autre inconvénient que de ne pas avoir un contrôle total sur le format du nom de fichier.

22
user1676075

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 garder les fichiers uniques. Il ajoutera également une extension de fichier qui est .tmp par défaut mais il peut être réglé 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 numéro est ajouté avec l'extension/suffixe de fichier (.tmp par défaut). . 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 via file.getName (); mais vous devrez le stocker 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éé.

19
AdrenalineJunky

1. Créer un fichier avec un nom aléatoire

File file = File.createTempFile(String prefix, String suffix, File parent)
  • Créez réellement le fichier sur le disque et renvoie l'objet fichier
  • Créez un nom de fichier dans ce format: préfixe + nombre aléatoire + suffixe
  • Utile lorsque vous devez créer un fichier temporaire sur le disque

2. Créer un fichier avec le nom exact

File file = new File(File parent, String child);
file.createNewFile();
  • Créez réellement le fichier sur le disque et retourne vrai si le fichier est créé avec succès

  • Le nom du fichier passera exactement au paramètre enfant

  • Utile lorsque vous devez créer un fichier permanent sur le disque

3. Créer uniquement un objet fichier (en mémoire)

File file = new File(File parent, String child);
// doesn't create the file on disk until calling createNewFile() method
  • Créer uniquement en mémoire et pas réellement sur le disque
  • Utile lorsque vous avez juste besoin de créer un objet fichier (par exemple juste pour le passer en paramètre)

parent Le paramètre peut être l'un de ceux-ci:

  1. Répertoires privés d'applications

    • context.getCacheDir ()
    • context.getExternalCacheDir ()
    • et ... (la liste complète peut être trouvée ici )
  2. Annuaires publics

    • Environment.getExternalStorageDirectory ()
    • Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES)
    • et ... (la liste complète peut être trouvée ici )
18
Behzad Bahmanyar