Как создать несколько файлов, генерируя случайное имя для каждого файла - PullRequest
0 голосов
/ 04 марта 2011

Я пытаюсь создать много случайных файлов, но я просто потерялся.Код ниже просто не работает, мне интересно, почему он не работает и что я могу сделать, чтобы это исправить.

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 ]

2 голосов
/ 04 марта 2011

Просто генерируя случайные числа, вы можете создать / перезаписать один и тот же файл несколько раз.Чтобы получить абсолютно уникальный набор, сделайте что-то вроде этого:

    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 голос
/ 04 марта 2011

Я не уверен, чего именно вы ожидаете от этого кода, но сейчас он фактически ничего не делает.

Вы много раз повторяете цикл, создавая экземпляр Formatter каждый раз. Это не файл; вместо этого это класс, который знает, как заменить токены в строках для создания других строк.

Я думаю, вы озадачены описанием конструктора, который вы вызываете, и целью класса в целом. В качестве первого аргумента конструктор принимает имя файла, который будет использоваться для вывода - в вашем случае это всегда будет %s.txt. Второй аргумент - это имя поддерживаемой кодировки, используемой для кодирования строки в файл.

Этот код всегда будет неудачным, потому что:

  1. Ваша переменная I_S, например, "56437890", не является допустимой кодировкой (тогда как "UTF-8" будет). Следовательно, конструктор, вероятно, сгенерирует исключение при попытке разработать схему кодирования.
  2. Даже если кодировка была чудесным образом верна, вы все равно пытаетесь записывать в один и тот же файл (%s.txt) каждый раз, чтобы не получить желаемого поведения с несколькими файлами.
    Эта строка может даже не быть допустимым именем файла, в зависимости от вашей ОС, и поэтому, если Formatter попытается создать файл, он выдаст исключение.
  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 совершенно прав, что у вас есть нетривиальный шанс повторить случайные числа, поэтому вы не получите столько файлов, сколько ожидаете. В ответе описан хороший способ избежать этого, и его стоит придерживаться.

1 голос
/ 04 марта 2011

Возможно, вы захотите написать что-то более похожее на это:

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 голос
/ 04 марта 2011

Как создать несколько файлов, генерируя произвольное имя для каждого файла .

Возможно, вы захотите взглянуть на File.createTempFile.

Глядя на свой код, вы, вероятно, хотите что-то вроде

Random rn = new Random();
String file;

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