我使用SWT在Java中编写应用程序。我想创建唯一的文件名。但我不想在硬盘上创建它。附加功能:我想在指定文件夹中创建唯一的文件名。
public String getUniqueFileName(String directory, String extension) {
//create unique file name
}
答案 0 :(得分:22)
使用GUID
答案 1 :(得分:13)
根据您的问题,我假设您已经看到File.createTempFile()
始终创建文件,而不仅仅是允许您生成名称。
但为什么不调用该方法然后删除创建的临时文件? createTempFile()
完成了在指定目录中查找唯一文件名的所有工作,并且由于您创建了该文件,因此您可以确定也将删除它。
File f = File.createTempFile("prefix",null,myDir);
String filename = f.getName();
f.delete();
答案 2 :(得分:7)
在文件名中使用时间戳?
当然,如果您具有非常高的并发性,这可能不起作用。
例如:
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();
}
AS John Oxley的回答表明。 UUID可能是一种解决方案,因为您可以使用4种不同的方案来创建它们。虽然碰撞的可能性很小。如果将时间戳与随机UUID结合使用,则任何冲突的可能性都会变得非常小。
答案 3 :(得分:3)
您可以尝试使用GUID作为文件名。
答案 4 :(得分:3)
简化了其他答案,使用GUID 。 imho无需将 salt 添加到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
答案 5 :(得分:1)
您可以创建具有任何名称(时间,GUID等)的文件,然后对其进行测试以查看它是否已存在。如果是,请尝试其他名称以查看它是否唯一。
File f = new File(guid);
if (f.exists()) {
//try another guid
}else{
//you're good to go
}
答案 6 :(得分:1)
您可以创建一个实际的唯一目录(子目录),然后创建任何文件 里面它应该是唯一的,例如" 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;
}
即使使用并发,此过程也应该在正常情况下工作。除非我们开始考虑想要占用我们的新目录或类似事物的嗅探器进程。
答案 7 :(得分:1)
使用Path API available from Java 7可以生成具有唯一生成名称的临时Path文件。
Files
实用工具类提供了Files.createTempFile
,其工作方式与File.createTempFile
类似,除了它会产生Path对象
所以调用方法
Path baseDir = ...
Files.createTempFile(baseDir, "status-log-", ".log");
// //dir path, prefix , suffix
会产生类似于
C:\...\status-log-4746781128777680321.log
如果要打开文件并在使用完毕后将其删除,则可以使用DELETE_ON_CLOSE
,该文件取自文档:
与File.createTempFile方法一样,此方法只是临时文件工具的一部分。在用作工作文件的情况下,可以使用DELETE_ON_CLOSE选项打开结果文件,以便在调用适当的close方法时删除该文件。另外,可以使用shutdown-hook或File.deleteOnExit机制自动删除文件。