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

时间:2011-03-04 16:19:51

标签: java random file try-catch

我想要做的是创建大量随机文件,但我只是完全迷失了。下面的代码不起作用,我想知道为什么它不起作用,我该怎么做才能解决它。

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 个答案:

答案 0 :(得分: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 :(得分: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 :(得分: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

答案 3 :(得分:1)

我不确定您希望此代码能够实现什么目标,但现在它实际上无效。

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

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

此代码将始终失败,因为:

  1. 您的I_S变量,例如“56437890”不是有效编码(而“UTF-8”将是)。因此,构造函数可能会在尝试编制编码方案时抛出异常。
  2. 即使charset奇迹般地正确,你仍然每次都试图写入同一个文件(%s.txt),所以你不会得到所需的多文件行为。
    此字符串甚至可能不是有效的文件名,具体取决于您的操作系统,因此如果Formatter尝试创建该文件,它将引发异常。
  3. 如果两个参数奇迹般地解决了,你仍然没有对格式化程序做任何事情,所以它没有任何东西要写出来,因此可能无法创建。< / LI>
  4. 最后,你没有在循环中更新你的随机变量(I_S) - 它被设置为一次,然后永远保持相同的值。所以甚至如果上述所有问题都不是问题,你仍然会反复创建相同的(单个)随机命名文件。
  5. 正如我在评论中指出的那样,当 失败时,你正在抓住并吞下异常,因此你绝对无法知道 出错了什么。< / p>

    从根本上说,我认为你对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完全正确,你有重复随机数的重要机会,所以你不会得到与你期望的完全一样多的文件。答案继续描述一种避免这种情况的好方法,值得关注。