我不一定想使用UUID,因为它们相当长。
文件只需要在其目录中是唯一的。
我想到一个方法是使用File.createTempFile(String前缀,String后缀)
,但这似乎是错误的,因为文件不是临时文件。
必须处理同一毫秒创建的两个文件的情况。
你可以使用具有3个参数的版本: File.createTempFile(String prefix, String suffix, File directory)
,它将允许你把临时文件放在你想要的位置。除非您告诉它,否则Java不会将其与任何其他文件区别对待。唯一的缺点是文件名保证至少有8个字符长(前缀至少3个字符,加上函数生成的5个或更多字符)。
如果这对你来说太长了,那么你可以从文件名"a"开始,并循环遍历"b"、"c"等,直到找到一个不存在的文件名为止。
我会使用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);
我使用时间戳
即
new File( simpleDateFormat.format( new Date() ) );
并将simpleDateFormat初始化为类似以下方式:
new SimpleDateFormat("File-ddMMyy-hhmmss.SSS.txt");
编辑
那么这个怎么办?
new File(String.format("%s.%s", sdf.format( new Date() ),
random.nextInt(9)));
除非在同一秒内创建的文件数量过多。
如果是这种情况并且名称不重要。
new File( "file."+count++ );
:P
这对我很有效:
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;
}
// 使用:
String newFile;
do{
newFile=generateUniqueFileName() + "." + FileExt;
}
while(new File(basePath+newFile).exists());
输出的文件名应该看起来像:
2OoBwH8OwYGKW2QE_4Sep2013061732GMT_1378275452253.Ext
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);
//Generating Unique File Name
public String getFileName() {
String timeStamp = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss").format(new Date());
return "PNG_" + timeStamp + "_.png";
}
File.createTempFile
在幕后所做的相同。 - usr-local-ΕΨΗΕΛΩΝselect mySequence.nextval from dual;
保证唯一性并且不会太大(除非你正在生成大量文件)。
我使用当前毫秒数和随机数字
例如
Random random=new Random();
String ext = ".jpeg";
File dir = new File("/home/pregzt");
String name = String.format("%s%s",System.currentTimeMillis(),random.nextInt(100000)+ext);
File file = new File(dir, name);
结合其他答案,为什么不使用带有随机值附加的ms时间戳;重复直到没有冲突,在实践中几乎永远不会发生。
例如:文件-ccyymmdd-hhmmss-mmm-rrrrrr.txt
(服务器名称)_(线程/进程名称)_(毫秒/时间戳).(扩展名)
例如:aws1_t1_1447402821007.png