【问题标题】:How to create tmp file name with out creating file如何在不创建文件的情况下创建临时文件名
【发布时间】:2009-08-18 12:56:18
【问题描述】:

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

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

【问题讨论】:

  • 如果您不创建文件,那么“唯一”到底是什么意思?您的意思是“与该目录中的所有其他文件名不同”吗?
  • 我想创建唯一的文件名:“与该目录中的所有其他文件名不同” - 完全正确。
  • @mykhaylo:意识到如果您不立即使用您获得的唯一文件名创建文件,则可能会出现另一个具有该名称的文件。甚至提供的一些答案也没有考虑到这种可能性。

标签: java file file-io


【解决方案1】:
【解决方案2】:

根据您的问题,我假设您已经看到 File.createTempFile() 总是创建一个文件,而不仅仅是允许您生成名称。

但是为什么不直接调用方法然后删除创建的临时文件呢? createTempFile() 负责在指定目录中查找唯一文件名,并且由于您创建了该文件,因此您可以确定您也将删除它。

File f = File.createTempFile("prefix",null,myDir);
String filename = f.getName();
f.delete();

【讨论】:

  • @Dave:f.delete() 之后的文件名不再保证是唯一的。在您删除由createTempFile() 创建的文件后,文件系统上可能会出现另一个同名文件。
  • @Grant Wagner:没错。这就是为什么操作需要是原子的。如果您只想生成一个随机名称,而不仅仅是将时间戳与一些随机数连接起来
  • @polvoazul:不幸的是,没有办法按照@michał-ziober 的要求来保证该目录中的文件名仍未使用。不适用于 GUID/UUID,不适用于时间戳和随机数。这是不可能的。 @dave-webb 的答案是最接近标准的答案(通过调用内置的 File.createTempFile)。之后删除文件只是为了满足原始问题的限制。
【解决方案3】:

在文件名中使用时间戳?

当然,如果你的并发性很高,这可能行不通。

例如:

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 结合起来,任何冲突的可能性都会变得非常小。

【讨论】:

    【解决方案4】:

    使用Path API available from Java 7,您可以生成一个具有唯一生成名称的临时路径文件。

    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 选项打开生成的文件,以便在调用适当的关闭方法时删除文件。或者,可以使用关闭挂钩或 File.deleteOnExit 机制自动删除文件。

    【讨论】:

      【解决方案5】:

      您可以尝试使用GUID 作为文件名。

      【讨论】:

        【解决方案6】:

        另一个版本,

        简化了其他答案,使用 GUID。恕我直言,无需将 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
        

        【讨论】:

          【解决方案7】:

          您可以创建一个实际的唯一目录(子目录),然后创建任何文件 它里面应该是唯一的,例如“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;
            }
          

          即使在并发的情况下,此过程也应该在正常情况下工作。除非我们开始考虑嗅探器进程想要占用我们的新目录或类似的东西。

          【讨论】:

            【解决方案8】:

            您可以创建一个具有任何名称(时间、GUID 等)的文件,然后对其进行测试以查看它是否已经存在。如果是这样,请尝试其他名称以查看它是否唯一。

            File f = new File(guid);
            if (f.exists()) {
              //try another guid
            }else{
              //you're good to go
            }
            

            【讨论】:

            • @Nick:在f.exists()//you're good to go 之间,文件系统上可能会出现具有该名称的文件。
            猜你喜欢
            • 2013-03-01
            • 1970-01-01
            • 2012-09-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-06
            • 1970-01-01
            相关资源
            最近更新 更多