Ответ 1
Используйте GUID
Я пишу приложение на Java с помощью SWT. Я хотел бы создать уникальное имя файла. Но я не хочу создавать его на жестком диске. Дополнительная функциональность: я хочу создать уникальное имя файла в папке с указанием.
public String getUniqueFileName(String directory, String extension) {
//create unique file name
}
Используйте GUID
Из вашего вопроса я предполагаю, что вы видели, что File.createTempFile()
всегда создает файл, а не просто позволяет вам генерировать имя.
Но почему бы просто не вызвать метод, а затем удалить созданный временный файл? createTempFile()
выполняет всю работу по поиску уникального имени файла в указанном каталоге, а так как вы создали файл, вы также можете его удалить.
File f = File.createTempFile("prefix",null,myDir);
String filename = f.getName();
f.delete();
Использовать временную метку в имени файла?
Конечно, это может не сработать, если у вас очень высокий concurrency.
Например:
public String getUniqueFileName(String directory, String extension) {
return new File(directory, new StringBuilder().append("prefix")
.append(date.getTime()).append(UUID.randomUUID())
.append(".").append(extension).toString()).getAbsolutePath();
}
Как объясняет Джон Оксли. UUID может быть решением, поскольку вы можете использовать 4 разных схемы для их создания. Хотя есть еще небольшой шанс столкновения. Если вы комбинируете временную метку со случайным UUID, вероятность любого столкновения становится исчезающе малой.
Вы можете попробовать использовать GUID для имени файла.
Вы можете создать файл с любым именем (время, GUID и т.д.), а затем проверить его, чтобы узнать, существует ли он. Если это так, попробуйте другое имя, чтобы узнать, уникально ли оно.
File f = new File(guid);
if (f.exists()) {
//try another guid
}else{
//you're good to go
}
Упростите другие ответы, Использовать GUID. Имхо не нужно добавлять соль к UUID
. Это то, что я использую:
public static String getUniqueFileName(String directory, String extension) {
String fileName = MessageFormat.format("{0}.{1}", UUID.randomUUID(), extension.trim());
return Paths.get(directory, fileName).toString();
}
использование:
String uniqueFileName = getUniqueFileName("/tmp", "pdf");
System.out.println(uniqueFileName);
Выход
/tmp/f34a960a-6001-44d6-9aa7-93ec6647a64a.pdf
вы можете создать фактический уникальный каталог (подкаталог), а затем любой файл внутри он должен быть уникальным, например "myFile". + расширение
public static String getUniqueFileName(String directory, String extension) {
try
{
// create actual unique subdirectory in the given directory
//
File myUniqueDir = File.createTempFile("udir", null,directory);
String filename = myUniqueDir.getName();
myUniqueDir.delete (); // don't want the file but a directory
myUniqueDir.mkdirs ();
}
//todo: catch ....
// for example:
return directory + "/" + myUniqueDir + "/myFile." + extension;
}
эта процедура должна работать в обычных сценариях даже с concurrency. Если мы не начнем думать о снифферных процессах, которые хотят занять наш новый каталог или подобные вещи.