如何在不创建文件的情况下创建临时文件名

时间:2009-08-18 12:56:19

标签: java file file-io

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

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

8 个答案:

答案 0 :(得分:22)

答案 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机制自动删除文件。