80 votes

Quelle est la meilleure façon de générer un nom de fichier unique et court en Java ?

Je ne veux pas nécessairement utiliser les UUID car ils sont assez longs.

Il suffit que le fichier soit unique dans son répertoire.

Une idée qui me vient à l'esprit est d'utiliser File.createTempFile(String prefix, String suffix) mais cela semble erroné car le fichier n'est pas temporaire.

Le cas de deux fichiers créés dans la même milliseconde doit être traité.

98voto

Pesto Points 16648

Eh bien, vous pourriez utiliser la version à 3 arguments : File.createTempFile(String prefix, String suffix, File directory) qui vous permettra de le placer où vous le souhaitez. À moins que vous ne le lui demandiez, Java ne le traitera pas différemment des autres fichiers. Le seul inconvénient est que le nom du fichier doit comporter au moins 8 caractères (au moins 3 caractères pour le suffixe, plus 5 caractères ou plus générés par la fonction).

Si c'est trop long pour vous, je suppose que vous pouvez toujours commencer par le nom de fichier "a", et passer en boucle par "b", "c", etc. jusqu'à ce que vous en trouviez un qui n'existe pas déjà.

32voto

Tomasz Blachowicz Points 2111

J'utiliserais la bibliothèque Apache Commons Lang ( http://commons.apache.org/lang ).

Il existe une classe org.apache.commons.lang.RandomStringUtils qui peut être utilisé pour générer des chaînes aléatoires d'une longueur donnée. Très pratique, pas seulement pour la génération de noms de fichiers !

Voici l'exemple :

String ext = "dat";
File dir = new File("/home/pregzt");
String name = String.format("%s.%s", RandomStringUtils.randomAlphanumeric(8), ext);
File file = new File(dir, name);

13voto

OscarRyz Points 82553

J'utilise l'horodatage

c.-à-d.

new File( simpleDateFormat.format( new Date() ) );

Et avoir le simpleDateFormat initialisé à quelque chose comme :

new SimpleDateFormat("File-ddMMyy-hhmmss.SSS.txt");

EDIT

Qu'en est-il

new File(String.format("%s.%s", sdf.format( new Date() ),
                                random.nextInt(9)));

Sauf si le nombre de fichiers créés dans la même seconde est trop élevé.

Si c'est le cas, et que le nom n'a pas d'importance.

 new File( "file."+count++ );

:P

10voto

Cela fonctionne pour moi :

    String generateUniqueFileName(){
    String filename="";
    long millis=System.currentTimeMillis();
    String datetime=new Date().toGMTString();
    datetime=datetime.replace(" ", "");
    datetime=datetime.replace(":", "");
    String rndchars=RandomStringUtils.randomAlphanumeric(16);
    filename=rndchars+"_"+datetime+"_"+millis;
    return filename;
}

//USE generateUniqueFileName()+"."+FileExt

Les noms de fichiers de sortie doivent ressembler à :

2OoBwH8OwYGKW2QE_4Sep2013061732GMT_1378275452253.Ext

8voto

pgras Points 7202

Regardez le Fichier javadoc la méthode createNewFile ne créera le fichier que s'il n'existe pas, et renverra un booléen pour dire si le fichier a été créé.

Vous pouvez également utiliser la méthode exists() :

    int i = 0;
    String filename = Integer.toString(i);
    File f = new File(filename);
    while (f.exists()) {
        i++;
        filename = Integer.toString(i);
        f = new File(filename);
    }
    f.createNewFile();
    System.out.println("File in use: " + f);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X