java随机生成文件名,怎么不重复 java随机生成文件名,怎么不重复 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 rstring = RandomStringUtil.getString(6);很少重复,可以调整参数,那样重复的几率就几乎不存在了。最好生成文件名后在判断一次是否存在,存在则重新生成。 这是RandomStringUtil的classpublic class RandomStringUtil { public static String getString(int length){ char[] charArray = new char[length]; for(int i=0;i<length;i++){ Random r = new Random(); int n = r.nextInt(123); while(n<48 || (n>57 && n<65) || (n>90 && n <97) || n>122){//(!((n>=48 && n<=57) || (n>=65 && n<=90) && (n>=97 && n<=122))){ n = r.nextInt(123); } charArray[i] = (char)n ; } return String.valueOf(charArray) ; }} 用当前时间+N位随机数 private String generateFileName() { // 获得当前时间 DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 转换为字符串 String formatDate = format.format(new Date()); // 随机生成文件编号 int random = new Random().nextInt(10000); return new StringBuffer().append(formatDate).append( random).toString(); } 方法1:使用java.util.UUID/** * @author troy(J2EE) * @version 1.0 */import java.util.UUID;public class Test{ public static void main(String[] args) { UUID uuid = UUID.randomUUID(); System.out.println(uuid); } }方法二(推荐)文件名后面加个时间戳/** * @author troy(J2EE) * @version 1.0 */import java.util.Date;public class Test{ public static void main(String[] args) { String fielName = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %1$tL",new Date())+".txt"; System.out.println(fielName); } }其他诸如使用集合set,for循环判断重复的就不推荐了 这中间 的 ‘//’在java中是不对的吧 需要转义啊怎么转啊 以下代码供参考:String str[] = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" }; Random tmp = new Random(); fileName = System.currentTimeMillis() + str[tmp.nextInt(10)] + "." + fileType; UUID uuid = UUID.randomUUID(); 我也用这个,不过它有36位.比较长. Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddkkmmss"); String filename = "文件名" + sdf.format(date) + "文件名的后缀"; 这样 就永远不会重复了. 用时间,精确到毫秒SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS"); 很简单~~~UUID+随便选一个随机数~~ 用 UUID 吧,其他的不管你用毫秒或者是什么都有可能会产生重复。 学习了感觉如果用时间的话,不精确到毫秒,也许就有问题这个得看具体的运行时间了。。UUID,应该可以吧 根据字母和数字的个数的10此方等(26+9)^10的概率可以减少重复问题....话句话说,每个用户的文件名称重复的概率只有:1/(26+9)^10几率........例子:String[] temp=new String[]{"a","b"....."z","1"......"9"}String result=null;Random rand=new Random();for(int i=0;i<temp.length;i++){ int j=rand.nextInt((26+9)); String str+=temp[j]; result=str;} 又学习到了可以用uuid以前一直是时间加个随机数的方式去做。 haha 这跟上传文件避免名字重复是一样的吧 UUID嘛,本来就是为了不重复而设计的 系统时间就没有重复的除非你非要更改时间别random一百万次或者一百万亿次总会重复的时间肯定不重复System.getCurrentTime()不是很好的嘛 for循环,那个判断条件却数组名丫 用UUID的确是王者之道,我也同意上面的说法,不过看你要求了,我测试过一个UUID的生成需要一百多毫秒,几次下来125~163毫秒不等,普通的成百行的代码是以纳秒计算速度,我一般要不重复很简单,我最喜欢的是用毫秒值,如果不放心在加一段随机数吧,这个重复的概率几乎为0,提取毫秒值很简单:System.currentTimeMillis();//long型数据,就这么简单呵呵,参考,不行还有纳秒值,一般一行最简单的代码执行也要很多纳秒呢,呵呵。 建议楼主 有些问题还是google问下 马上能得到答案! 比较难的你才来这问省积分啊 按钮要求的等级来选择不同的方法,1. 要求一般的, 随机数,然后判断是否已经存在了,否则成功,是则循环。 有点恶心,几万个或者几百万个之后还不判断死了。2. 用时间+随机数,只要时间足够精确,而且是获取的真实时间,不是OS系统里的时间。 这种方法也挺不爽。。 要求必须是实际时间。而且整个随机数是一半伪随机的一半是有规律性的(时间是递增的),另外,也无法保证两个对象同时刻运行时不产生相同的数!3. 用UUID。 这种方法能保证万无一失。 虽然有点耗时间。 但毕竟是别人已经总结好的非常成熟的算法,com中用到的id值能够保证时间与空间上的绝对唯一性。 我想JAVA的uuid也是可以保证的。世界上任意两个地方在任何时间永远不可能产生同一个数。 如果你的系统要保证绝对的可靠这种方法可行。 while(n<48 || (n>57 && n<65) || (n>90 && n <97) || n>122){//(!((n>=48 && n<=57) || (n>=65 && n<=90) && (n>=97 && n<=122))) 什么意思?看不懂 文件名后面加 System.currentTimeMillis() 这个不会重复。你知道UUID的原理么 UUID.randomUUID()while(重复){UUID.randomUUID()} JAVA生成不重复的临时文件的方法import java.io.File;/** * JAVA生成不重复的临时文件的方法。 * * @author JAVA世纪网(java2000.net) */public class Test { public static void main(String[] args) throws Exception { File f = File.createTempFile("test", "file"); // // C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\test3654095372928367563file System.out.println(f.getAbsolutePath()); f.deleteOnExit(); }} 我来发个不同的声音吧,单例模式(singleton), 使用一个计数器,在程序退出时候,保存当前值。在程序启动的时候,读入上次保存的值注意,需要线程同步前面诸位说的用时间的毫秒数也可以,不过注意一点,也需要加上线程同步。不然有可能2个线程得到同一个值 UUID永远都不会重复 不过我一般用精确到毫秒的时间加几个随机数字 加上当前的时间戳 文件名+System.currentTimeMillis() 取系统的当前是时间(纳秒)做为新的文件名.long time = System.nanoTime();将文件重命名fileName.renameTo(time + fileName); uuid,还是时间戳,都不错,但要想完全避免重复(时间可能不在同一天而重复,除非年月日,时分秒,但太大太了),最好判定哈吧!用hashtable进行判定吧 UUID,不会重复,但比较长,用时间戳也是个好主意 是的 hibernate 有一种主键生成方式好象 就是 uuid 用时间,精确到毫秒SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS"); [Quote=引用 1 楼 dqlmj2009 的回复:]rstring = RandomStringUtil.getString(6);很少重复,可以调整参数,那样重复的几率就几乎不存在了。最好生成文件名后在判断一次是否存在,存在则重新生成。 和3楼的意见是一样的UUID,正常情况下这辈子都重复不了了 UUID uuid = UUID.randomUUID();String fileName = uuid.toString(); public static String getUqFileName(String ext){ String result=""; StringBuffer sb=new StringBuffer(); sb.append(toString(new java.util.Date(),"yyyyMMddhhmmssSSS")); sb.append(getRandomString(8)); ext=toNotNull(ext,".jpg").trim(); if(!ext.equals("")){ if(!ext.startsWith(".")){ sb.append('.'); } sb.append(ext); } result=sb.toString(); return result; } public static final String getRandomString(int length) { if (length < 1) { return null; } char[] numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") .toCharArray(); java.util.Random randGen = new java.util.Random(); char[] randBuffer = new char[length]; for (int i = 0; i < randBuffer.length; i++) { randBuffer[i] = numbersAndLetters[randGen.nextInt(61)]; } return new String(randBuffer); } public static final String toString(java.util.Date v, String format) { java.text.SimpleDateFormat simpleDate = new java.text.SimpleDateFormat( format); String temp = simpleDate.format(v); simpleDate = null; return temp; } 使用UUID不便于按时间范围统计或备份文件,建议使用时间+随机串的方式,即不重复又按时间有规则,可以指定日期段备份或统计 神马时间,豪秒,单例, 有一种名词叫集群, 再想想, 都有可能重复, 用UUID, 基本上不会重复 集成ssh后,factory和session如何修改? java_web 为什么用object的克隆方法出现错误那无语了 如何用java识别验证码?? 求助 搞不懂为何tomcat前两天可以用现在用不了了 删除功能实现问题 !!!!!!!!!!!!!JSF中传递参数的问题!!!!!!!!!!!!!!!!!!! 请大家给我个大题数目,谢谢 这是我自己开发的一套报表显示程序请大家评价 Eureka只能注册到本地嘛? 我的JSP只能通过ACTION访问? 求救!!在整合struts和spring是为什么老是出现NullPointerException??
最好生成文件名后在判断一次是否存在,存在则重新生成。
public class RandomStringUtil { public static String getString(int length){
char[] charArray = new char[length];
for(int i=0;i<length;i++){
Random r = new Random();
int n = r.nextInt(123);
while(n<48 || (n>57 && n<65) || (n>90 && n <97) || n>122){//(!((n>=48 && n<=57) || (n>=65 && n<=90) && (n>=97 && n<=122))){
n = r.nextInt(123);
}
charArray[i] = (char)n ;
}
return String.valueOf(charArray) ;
}
}
private String generateFileName() {
// 获得当前时间
DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
// 转换为字符串
String formatDate = format.format(new Date());
// 随机生成文件编号
int random = new Random().nextInt(10000);
return new StringBuffer().append(formatDate).append(
random).toString();
}
* @author troy(J2EE)
* @version 1.0
*/
import java.util.UUID;
public class Test
{
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
System.out.println(uuid);
}
}
方法二(推荐)
文件名后面加个时间戳
/**
* @author troy(J2EE)
* @version 1.0
*/
import java.util.Date;
public class Test
{
public static void main(String[] args) {
String fielName = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %1$tL",new Date())+".txt";
System.out.println(fielName);
}
}其他诸如使用集合set,for循环判断重复的就不推荐了
String str[] = { "a", "b", "c", "d", "e", "f", "g",
"h", "i", "j" };
Random tmp = new Random();
fileName = System.currentTimeMillis()
+ str[tmp.nextInt(10)] + "." + fileType;
我也用这个,不过它有36位.比较长.
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddkkmmss");
String filename = "文件名" + sdf.format(date) + "文件名的后缀";
这样 就永远不会重复了.
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS");
String[] temp=new String[]{"a","b"....."z","1"......"9"}String result=null;Random rand=new Random();for(int i=0;i<temp.length;i++){
int j=rand.nextInt((26+9));
String str+=temp[j];
result=str;
}
以前一直是时间加个随机数的方式去做。
除非你非要更改时间
别random
一百万次或者一百万亿次总会重复的
时间肯定不重复
System.getCurrentTime()不是很好的嘛
System.currentTimeMillis();//long型数据,就这么简单
呵呵,参考,不行还有纳秒值,一般一行最简单的代码执行也要很多纳秒呢,呵呵。
有点恶心,几万个或者几百万个之后还不判断死了。
2. 用时间+随机数,只要时间足够精确,而且是获取的真实时间,不是OS系统里的时间。
这种方法也挺不爽。。 要求必须是实际时间。而且整个随机数是一半伪随机的一半是有规律性的(时间是递增的),另外,也无法保证两个对象同时刻运行时不产生相同的数!
3. 用UUID。 这种方法能保证万无一失。 虽然有点耗时间。 但毕竟是别人已经总结好的非常成熟的算法,com中用到的id值能够保证时间与空间上的绝对唯一性。 我想JAVA的uuid也是可以保证的。世界上任意两个地方在任何时间永远不可能产生同一个数。 如果你的系统要保证绝对的可靠这种方法可行。
UUID.randomUUID()
}
import java.io.File;/**
* JAVA生成不重复的临时文件的方法。
*
* @author JAVA世纪网(java2000.net)
*/
public class Test {
public static void main(String[] args) throws Exception {
File f = File.createTempFile("test", "file");
//
// C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\test3654095372928367563file
System.out.println(f.getAbsolutePath());
f.deleteOnExit();
}
}
前面诸位说的用时间的毫秒数也可以,不过注意一点,也需要加上线程同步。不然有可能2个线程得到同一个值
long time = System.nanoTime();
将文件重命名fileName.renameTo(time + fileName);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS");
rstring = RandomStringUtil.getString(6);很少重复,可以调整参数,那样重复的几率就几乎不存在了。
最好生成文件名后在判断一次是否存在,存在则重新生成。
String fileName = uuid.toString();
String result="";
StringBuffer sb=new StringBuffer();
sb.append(toString(new java.util.Date(),"yyyyMMddhhmmssSSS"));
sb.append(getRandomString(8));
ext=toNotNull(ext,".jpg").trim();
if(!ext.equals("")){
if(!ext.startsWith(".")){
sb.append('.');
}
sb.append(ext);
}
result=sb.toString();
return result;
} public static final String getRandomString(int length) {
if (length < 1) {
return null;
}
char[] numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
.toCharArray(); java.util.Random randGen = new java.util.Random(); char[] randBuffer = new char[length];
for (int i = 0; i < randBuffer.length; i++) {
randBuffer[i] = numbersAndLetters[randGen.nextInt(61)];
}
return new String(randBuffer);
}
java.text.SimpleDateFormat simpleDate = new java.text.SimpleDateFormat(
format);
String temp = simpleDate.format(v);
simpleDate = null;
return temp;
}