如何使用创建文件创建tmp文件名

问题描述:

我使用SWT在Java中编写应用程序。我想创建独特的文件名。但我不想在硬盘上创建它。附加功能:我想在指定的文件夹中创建唯一的文件名。如何使用创建文件创建tmp文件名

public String getUniqueFileName(String directory, String extension) { 
     //create unique file name 
} 
+0

如果不创建文件,那么你的意思是什么“独一无二”?你的意思是“与该目录中的所有其他文件名不同”? – lindelof 2009-08-18 13:08:45

+0

我想创建唯一的文件名:“与该目录中的所有其他文件名不同“ - 准确地说, – 2009-08-18 13:18:08

+4

@mykhaylo:意识到如果你没有立即使用你获得的唯一文件名来创建一个文件,那么可能会有另一个具有该名称的文件可能会弹出到existenc即即使提供的一些答案也没有考虑到这种可能性。 – 2009-08-18 16:16:26

在文件名中使用时间戳吗?

当然,如果您具有非常高的并发性,这可能无法正常工作。

例如:

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 
} 
+5

@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(); 
+11

@Dave:在'f.delete()'之后,文件名不再保证是唯一的。在删除由'createTempFile()创建的文件后,在文件系统上会出现另一个具有相同名称的文件。 – 2009-08-18 16:18:31

+0

@Grant Wagner:的确如此。这就是为什么操作需要原子化。如果你只是想产生一个随机的名字,而不仅仅是用一些随机数连接时间戳 – polvoazul 2016-08-18 19:28:45

+1

@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; 
    } 

这个过程应该在正常的情况下工作,即使并发。除非我们开始在想占领我们新目录或类似的东西嗅探器进程的思想。