Каков наилучший способ создания уникального и короткого имени файла в Java - PullRequest
68 голосов
/ 05 мая 2009

Я не хочу использовать UUID, так как они довольно длинные.

Файл должен быть уникальным в своем каталоге.

Одна мысль, которая приходит в голову, - это использовать File.createTempFile(String prefix, String suffix), но это кажется неправильным, поскольку файл не является временным.

Необходимо обработать регистр двух файлов, созданных за одну и ту же миллисекунду.

Ответы [ 15 ]

83 голосов
/ 05 мая 2009

Ну, вы можете использовать версию с тремя аргументами: File.createTempFile(String prefix, String suffix, File directory), которая позволит вам поместить ее туда, где вы хотите. Если вы не скажете это, Java не будет обрабатывать это иначе, чем любой другой файл. Единственным недостатком является то, что имя файла гарантированно должно иметь длину не менее 8 символов (минимум 3 символа для префикса плюс 5 или более символов, сгенерированных функцией).

Если это слишком долго для вас, я полагаю, что вы всегда можете просто начать с имени файла "a" и переходить к "b", "c" и т. Д., Пока не найдете тот, который еще не существует.

27 голосов
/ 05 мая 2009

Я бы использовал библиотеку Apache Commons Lang (http://commons.apache.org/lang).

Существует класс org.apache.commons.lang.RandomStringUtils, который можно использовать для генерации случайных строк заданной длины. Очень удобно не только для генерации имени файла!

Вот пример:

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);
12 голосов
/ 05 мая 2009

Я использую метку времени

* 1003 т.е. *

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

И инициализировать simpleDateFormat что-то вроде:

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

EDIT

А как же

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

Если количество файлов, созданных за одну и ту же секунду, слишком велико.

Если это так, и имя не имеет значения

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

: Р * * тысяча двадцать-одна

10 голосов
/ 04 сентября 2013

Это работает для меня:

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:

String newFile;
do{
newFile=generateUniqueFileName() + "." + FileExt;
}
while(new File(basePath+newFile).exists());

Выходные имена файлов должны выглядеть следующим образом:

2OoBwH8OwYGKW2QE_4Sep2013061732GMT_1378275452253.Ext
6 голосов
/ 05 мая 2009

Посмотрите на Файл javadoc , метод createNewFile создаст файл, только если он не существует, и вернет логическое значение, чтобы сказать, был ли файл создан.

Вы также можете использовать метод существующие ():

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);
5 голосов
/ 05 мая 2009

Если у вас есть доступ к базе данных, вы можете создать и использовать последовательность в имени файла.

select mySequence.nextval from dual;

Он будет гарантированно уникальным и не должен быть слишком большим (если вы не качаете тонну файлов).

2 голосов
/ 21 февраля 2018
    //Generating Unique File Name
    public String getFileName() {
        String timeStamp = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(new Date());
        return "PNG_" + timeStamp + "_.png";
    }
2 голосов
/ 05 мая 2009

Объединяя другие ответы, почему бы не использовать метку времени мс с добавленным случайным значением; повторяйте до тех пор, пока не возникнет конфликт, чего на практике почти не будет.

Например: File-ccyymmdd-hhmmss-mmm-rrrrrr.txt

2 голосов
/ 05 мая 2009

Почему бы просто не использовать что-то, основанное на отметке времени ..?

0 голосов
/ 20 сентября 2018

Проблема в синхронизации. Отделите районы конфликта.

Назовите файл как: (server-name)_(thread/process-name)_(millisecond/timestamp).(extension)
пример: aws1_t1_1447402821007.png

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...