唯一地创建子文件

时间:2015-09-07 12:03:35

标签: java algorithm file naming

我有一个问题。

我有一个名为例如abc的文件。在处理这个文件时,我会得到一些其他文件,这些文件会有一些独特的信息,比如标签或一些值。我想将它们命名为abc#unique_id。它就像一个完美/内射散列函数。我不能使用普通的哈希函数,因为我可以得到哈希的碰撞。我正在考虑生成一个随机数并检查是否存在名为so的文件,如果是,则生成另一个数字。但如果有更多文件,这可能会降低效率。

3 个答案:

答案 0 :(得分:2)

您可以使用File.createTempFile(String prefix, String suffix, File directory)。来自javadoc:

  

在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。如果此方法成功返回,则保证:

     
      
  • 在调用此方法之前,返回的抽象路径名表示的文件不存在,

  •   
  • 此方法及其任何变体都不会在当前虚拟机调用中再次返回相同的抽象路径名。

  •   

在你的情况下,你想做这样的事情:

File newFile = File.createTempFile("abc#", ".ext", new File("/path/to/your/directory/"));
// use newFile

答案 1 :(得分:0)

考虑将当前时间/日期添加到文件名的末尾。 System.currentTimeMillis();会将当前时间设为Long,并且您可能会在同一时间(低至毫秒)获得多个文件。

更多信息here

答案 2 :(得分:0)

您也可以使用计数器。这是一个使用它的类的简单示例。请注意,同步getName以在多线程环境中也授予正确的计数器变量值。

public class FileHelper {
    private static int counter = 0;

    static {
        init();
    }

    private static init() {
       // load last counter value from database, 
       // scanning files in the directory or saving it to a property file.
    }

    public static synchronized String getName() {
        counter++;
        return "name_" + counter;
    }
}

如果需要存储上次使用的计数器,可以添加一个init函数来加载上次使用的计数器,例如从数据库中加载,或扫描创建文件的目录,或将其保存到属性文件。