2014-11-24 65 views
2

我有一个存储测试问题的文件。如果名称存在,则创建并增加文件名

"Test.ser" 

我希望能够用同样的名称创建文件,但也有一些增量器附加每次有人需要测试存储答案。

"Test1.ser" 
"Test2.ser" 
    ... 

但是,我想不出一种方法来实现这一点。一个计数器可以工作,但如果有人重新运行程序,计数器会重置。

有没有人有一个想法这是可能的?非常感谢!

编辑:

int count = 1; 
while (searching) { 
    fileName = survey.name + Integer.toString(count) + ".ser"; 
    f = new File(fileName); 

    if(f.exists()) { 
     count++; 
    } else { 
     searching = false; 
    } 
} // Proceed to use file name 

不能让它就增加近file_name1.ser

+2

不断递增的计数器,并试图名,直到文件名不存在。 – 2014-11-24 00:55:10

+0

@JasonC谢谢杰森,我没有想到这一点。我会尝试使用这种方法! – Brejuro 2014-11-24 00:56:10

+0

类文件有一个exists()方法。只需创建一个文件名序列,直到找到一个未使用的文件名为止。 – antonpp 2014-11-24 00:56:55

回答

4

我建议你使用String.format(String, Object...)File.exists()和类似

public static void main(String[] args) { 
    String fmt = "Test%02d.ser"; 
    File f = null; 
    for (int i = 1; i < 100; i++) { 
     f = new File(String.format(fmt, i)); 
     if (!f.exists()) { 
      break; 
     } 
    } 
    try { 
     System.out.println(f.getCanonicalPath()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

编辑

正如在评论中指出的,这只能重试100次。如果你想支持100多个重试,你可以写for循环一样,

for (int i = 1;; i++) 
+0

如果存在100个文件,这将引发NPE。可能不理想的行为。 – 2014-11-24 01:03:10

+0

@JasonC我认为如果100次测试失败,它会失败很快,我不认为101st会帮忙。 – 2014-11-24 01:06:35

+0

我的意思是它应该可能会失败,比NPE更具信息性。 (“不可取”是指抛出NPE,而不是在100个文件后失败,对不起) – 2014-11-24 01:07:00

2

一个简单的方法来解决这个问题将被追加的日期和时间的文件名。

例如使用格式(年月日 - HHMM):

Test-20141122_2058.ser 
Test-20141123_1931.ser 
Test-20141123_2157.ser 
+2

此外:考虑在末尾添加秒或随机字符串(或甚至例如进程或线程ID),如果多个用户可以立即进行此测试,或者如果测试可以在60秒内完成。 – 2014-11-24 01:08:51

+0

这种方法很好地创建文件,但是在读取文件时不太实际。 – 2017-01-11 13:22:00

+0

为什么不呢?你可以用正则表达式来获取名字,这很快。 也许我应该在日期和时间之前添加answersId,并且您可以通过answersId轻松读取文件。 – sebadagostino 2017-01-12 14:21:19

相关问题