2011-03-04 38 views
0

我想要做的是创建大量的随机文件,但我完全失去了。下面的代码只是不起作用,我想知道为什么它不起作用,我能做些什么来解决它。如何创建多个文件,为每个文件生成一个随机名称

import java.io.*; 
import java.util.*; 

public class main { 
    public static void main(String arg[]){ 

     Random rn = new Random(); 
     int randn = 1+rn.nextInt(999999990); 
     String I_S = Integer.toString(randn); 

     Formatter file; 


     try{ 

      for(int i = 0; i < 9999999; i++){ 
       file = new Formatter("%s.txt", I_S); 
      } 
     } 
     catch(Exception ex){ 
     System.err.println("Error"); 
     } 

    } 

}

+4

什么问题?编译器错误?结果不好?什么“不起作用”? – McGlone 2011-03-04 16:21:13

+1

'File.createTempFile()'有什么问题? – skaffman 2011-03-04 16:22:32

+1

当你捕捉到异常'ex'时,你可能应该用*做些什么*,因为这将包含失败的所有细节。虽然在大型应用程序中这不是一个好主意,但现在只要调用'ex.printStackTrace()'就会将异常详细信息打印到控制台,从而让您了解问题所在。 – 2011-03-04 16:22:56

回答

1

如何创建多个文件,每个文件生成一个随机名称。

你可能想看看File.createTempFile

看你的代码,你可能要像

Random rn = new Random(); 
String file; 

for (int i = 0; i < 100; i++) 
    file = String.format("%i.txt", 1+rn.nextInt(999999990)); 
2

通过刚刚产生的随机数,你可能最终创建/覆盖相同的文件多次。有一个绝对独特的一套,做这样的事情:

final int MAX = 9999999; 

    List<Integer> list = new ArrayList<Integer>(); 

    for (int i = 0; i < MAX; i++) { 
     list.add(i); 
    } 

    Collections.shuffle(list); 

    for (int i = 0; i < MAX; i++) { 
     // create files here 
    } 
1

你可能想看看写更多的东西是这样的:

void Write() 
{ 
    try { 
     for(int i = 0; i < MAX_FILES; i++) { 
      FileWriter outFile = new FileWriter("C:\File" + i.toString() + ".txt"); 
      PrintWriter out = new PrintWriter(outFile); 

      // Write text to file 
      out.println("This is line 1"); 
      out.println("This is line 2"); 
      out.print("This is line3 part 1, "); 
      out.println("this is line 3 part 2"); 
      out.close(); 
     } 
    } 
      catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
// obviously this requires a import java.io.*; at the top of the class 

来源:http://www.abbeyworkshop.com/howto/java/writeText/index.html

1

我不知道正是你期望的代码实现,但现在它实际上什么都不做。

您正在循环多次,每次创建Formatter的实例。这不是一个文件;相反,它是一个知道如何替换字符串中的标记以创建其他字符串的类。

我认为你对你所调用的构造函数的描述以及整个类的目的感到困惑。构造函数将第一个参数作为用于输出的文件的名称 - 在您的情况下,这将始终为%s.txt。第二个参数是用于将String编码到文件的受支持的字符集的名称。

此代码总是会失败,因为:

  1. I_S变量,例如, “56437890” 是不是一个有效的编码(而 “UTF-8” 将是)。因此,构造函数在尝试编码编码方案时可能会引发异常。
  2. 即使字符集奇迹般地正确,您仍然试图每次都写入相同的文件(%s.txt),因此您不会获得所需的多文件行为。
    这个字符串甚至可能不是一个有效的文件名,这取决于您的操作系统,所以如果格式化程序试图创建文件,它将引发异常。
  3. 如果两个参数都奇迹般地出现了,你仍然没有对格式化程序做任何事情,所以它不会有任何东西写出来,因此可能不会创建任何文件。
  4. 最后,您不会更新循环中的随机变量(I_S) - 它会设置一次,然后永远保持相同的值。所以甚至如果所有上述问题都没有问题,你仍然会一遍又一遍地创建相同的(单个)随机命名文件。

正如我在评论中指出,失败的话,你捕捉和吞咽异常,所以你绝对没有办法知道什么出了问题。

基本上我认为你对Formatter类的目的感到困惑,因为我不知道你想达到什么目的(文件应该是空的?在文件中有特定的文本吗?)我不能建议一些绝对有效的东西。不过,如果你只是想创建空文件,试试你的循环内是这样的:

String filename = "%s.txt".format(I_S); 
File file = new File(filename); 
file.createNewFile(); 
// Add some logic to update the random variable here! 

最后一点,adarshr's answer是你站在重复随机数的非平凡机会完全正确的,所以你赢了”您可以获得与您期望的一样多的文件。答案在于描述一种避免这种情况的好方法,值得关注。

+0

谢谢你的快速回复家伙,非常感谢。 – Andy 2011-03-04 16:53:14

相关问题