如何使用创建文件创建tmp文件名
我使用SWT在Java中编写应用程序。我想创建独特的文件名。但我不想在硬盘上创建它。附加功能:我想在指定的文件夹中创建唯一的文件名。如何使用创建文件创建tmp文件名
public String getUniqueFileName(String directory, String extension) {
//create unique file name
}
在文件名中使用时间戳吗?
当然,如果您具有非常高的并发性,这可能无法正常工作。
例如:
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等)创建一个文件,然后测试它是否已经存在。如果确实如此,请尝试使用其他名称以查看它是否是唯一的。
File f = new File(guid);
if (f.exists()) {
//try another guid
}else{
//you're good to go
}
@Nick:在'f.exists()'和'//你很好去'之间'一个具有该名字的文件可以出现在文件系统上。 – 2009-08-18 16:17:23
从你的问题我想你已经看到了File.createTempFile()
通常会创建一个文件,而不是只让你生成的名字。
但是,为什么不只是调用方法,然后删除创建的临时文件? createTempFile()
完成了在指定目录中查找唯一文件名的所有工作,并且自创建该文件以来,您也一定会将其删除。
File f = File.createTempFile("prefix",null,myDir);
String filename = f.getName();
f.delete();
@Dave:在'f.delete()'之后,文件名不再保证是唯一的。在删除由'createTempFile()创建的文件后,在文件系统上会出现另一个具有相同名称的文件。 – 2009-08-18 16:18:31
@Grant Wagner:的确如此。这就是为什么操作需要原子化。如果你只是想产生一个随机的名字,而不仅仅是用一些随机数连接时间戳 – polvoazul 2016-08-18 19:28:45
@polvoazul:不幸的是,没有办法做@michał-ziober所要求的并且保证文件名在该目录中仍然没有被使用。不带GUID/UUID,不带时间戳和随机数。这是不可能的。 @ dave-webb的答案是最接近你的标准(通过调用内置的'File.createTempFile')。删除文件只是为了满足原始问题的限制。 – onlynone 2016-12-13 15:26:08
另一个版本,
简化其他的答案,使用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;
}
这个过程应该在正常的情况下工作,即使并发。除非我们开始在想占领我们新目录或类似的东西嗅探器进程的思想。
如果不创建文件,那么你的意思是什么“独一无二”?你的意思是“与该目录中的所有其他文件名不同”? – lindelof 2009-08-18 13:08:45
我想创建唯一的文件名:“与该目录中的所有其他文件名不同“ - 准确地说, – 2009-08-18 13:18:08
@mykhaylo:意识到如果你没有立即使用你获得的唯一文件名来创建一个文件,那么可能会有另一个具有该名称的文件可能会弹出到existenc即即使提供的一些答案也没有考虑到这种可能性。 – 2009-08-18 16:16:26