在Java中生成唯一和短文件名的最佳方法是什么

Jef*_*oom 70 java file

我不一定想使用UUID,因为它们相当长.

该文件只需要在其目录中是唯一的.

想到的一个想法是使用File.createTempFile(String prefix, String suffix),但这似乎是错误的,因为该文件不是临时的.

需要处理在相同毫秒内创建的两个文件的情况.

Pes*_*sto 87

好吧,你可以使用3参数版本:File.createTempFile(String prefix, String suffix, File directory)它可以让你把它放在你想要的地方.除非你告诉它,否则Java不会以不同于任何其他文件的方式对待它.唯一的缺点是文件名保证长度至少为8个字符(前缀最少3个字符,加上函数生成的5个或更多字符).

如果这对你来说太长了,我想你总是可以从文件名"a"开始,然后循环"b","c"等,直到找到一个尚不存在的文件.

  • 根据文档,它将保证(1)在调用此方法之前,返回的抽象路径名表示的文件不存在,并且(2)此方法或其任何变体都不会再次返回相同的抽象路径名.当前调用虚拟机.因此,如果您在同一目录中创建文件 - 而不是删除它们 - 是的,它们将是唯一的. (6认同)
  • 但是它会保证程序多次运行之间的唯一性吗? (2认同)

Tom*_*icz 27

我使用Apache Commons Lang库(http://commons.apache.org/lang).

有一个类org.apache.commons.lang.RandomStringUtils可用于生成给定长度的随机字符串.非常方便,不仅用于文件名生成!

这是一个例子:

String ext = "dat";
File dir = new File("/home/pregzt");
String name = String.format("%s.%s", RandomStringUtils.randomAlphanumeric(8), ext);
File file = new File(dir, name);
Run Code Online (Sandbox Code Playgroud)

  • @marcolopes:但两个文件名称相同的可能性非常小.如果我们有62个不同的字符(我不知道有多少个RandomStringUtils使用; 62是我对区分大小写的猜测)它是62 ^ n,其中n是你的文件名长度.对于长度为8的上述例子,机会为2.183401056×10 15. (7认同)

Osc*_*Ryz 12

我使用时间戳

new File( simpleDateFormat.format( new Date() ) );
Run Code Online (Sandbox Code Playgroud)

并将simpleDateFormat初始化为如下:

new SimpleDateFormat("File-ddMMyy-hhmmss.SSS.txt");
Run Code Online (Sandbox Code Playgroud)

编辑

关于什么

new File(String.format("%s.%s", sdf.format( new Date() ),
                                random.nextInt(9)));
Run Code Online (Sandbox Code Playgroud)

除非在同一秒内创建的文件数太多.

如果是这样的话,名称并不重要

 new File( "file."+count++ );
Run Code Online (Sandbox Code Playgroud)

:P

  • 是的,但如果在同一秒或毫秒内创建两个文件会怎样. (12认同)
  • 毫秒不太可能,您可以在其上放置一个计时器以停止在同一秒内创建文件... (2认同)

MD.*_*med 10

这对我有用:

String generateUniqueFileName() {
    String filename = "";
    long millis = System.currentTimeMillis();
    String datetime = new Date().toGMTString();
    datetime = datetime.replace(" ", "");
    datetime = datetime.replace(":", "");
    String rndchars = RandomStringUtils.randomAlphanumeric(16);
    filename = rndchars + "_" + datetime + "_" + millis;
    return filename;
}
Run Code Online (Sandbox Code Playgroud)

// USE:

String newFile;
do{
newFile=generateUniqueFileName() + "." + FileExt;
}
while(new File(basePath+newFile).exists());
Run Code Online (Sandbox Code Playgroud)

输出文件名应如下所示:

2OoBwH8OwYGKW2QE_4Sep2013061732GMT_1378275452253.Ext
Run Code Online (Sandbox Code Playgroud)


pgr*_*ras 7

查看File javadoc,createNewFile方法只有在文件不存在时才会创建文件,并返回一个布尔值来说明文件是否已创建.

您还可以使用exists()方法:

int i = 0;
String filename = Integer.toString(i);
File f = new File(filename);
while (f.exists()) {
    i++;
    filename = Integer.toString(i);
    f = new File(filename);
}
f.createNewFile();
System.out.println("File in use: " + f);
Run Code Online (Sandbox Code Playgroud)


Sha*_*ane 5

如果您有权访问数据库,则可以在文件名中创建和使用序列.

select mySequence.nextval from dual;
Run Code Online (Sandbox Code Playgroud)

它将保证是独一无二的,不应该太大(除非你抽出大量的文件).

  • 为什么这个被贬低?虽然它显然不是最优雅的解决方案,但它至少应该满足OP的要求.我认为这是一种完全有效的方法,特别是如果OP计划以某种方式将这些信息与数据库结合在一起. (2认同)