2013-12-19 3 views
1

Я делаю программу, и мне нужно добавить список случайных 6-значных идентификаторов в файл. В настоящее время всякий раз, когда я запускаю эту часть программы, в файл ничего не добавляется. Что я делаю неправильно, чтобы код не записывался в файл? Я проверил и убедился, что все случайные числа определенно генерируются.BufferedWriter не пишет в файл

static HashSet<Integer> idHashList = 
     new HashSet<>(); 

public static void createIds(){ 
    File writeId = new File("peopleIDs.txt"); 
    try { 
     FileWriter fw = new FileWriter(writeId,true); 
     BufferedWriter out = new BufferedWriter(fw); 

     for(int i = 0; i < 100; i++){ 
      out.write(People.genRand()); 
     } 
     out.close(); 
    } catch (IOException ex) { 
     System.out.println(ex.getMessage()); 
    } 
} 

protected static int genRand(){ 
    while(true){ 
     int rand = ((int) ((Math.random() * (899999))+100000)); 
     if(idHashList.add(rand)){ 
      return rand; 
     } 
    } 
} 
+1

1) Скомпилирует ли это? Похоже, у вас есть два метода, которые одинаковы. 2) Зачем писать о idHashList, когда он не используется нигде в вашем коде? 3) Вы уверены, что 'People.genRand()' делает то, что вы думаете? Вы пробовали распечатать, что он возвращает, а затем записать его в файл, чтобы проверить что-то? –

+1

Woops! @HovercraftFullOfEels дважды копировал одно и то же: P. Исправлено: – bob

+1

@ TomaszGawel Почему? 'flush()' происходит автоматически в 'close().' См. Javadoc. – EJP

ответ

4

Возможно, это файл, но не тот, который вы считаете. Java будет записывать в файл peopleIDs.txt в текущем каталоге. Текущий каталог - это каталог, из которого выполняется команда java.

Если вы запустите программу из своей IDE, проверьте конфигурацию запуска, чтобы узнать, в какой текущей директории она используется. Если вы действительно не знаете, тогда найдите peopleIDs.txt на своем жестком диске, чтобы узнать.

При этом close() должен быть в блоке finally. Или еще лучше, вы должны использовать конструкцию try-with-resources.

+0

Может подтвердить, что все файлы с именем 'peopleIds.txt' пусты. Я использую NetBeans, и у них также есть папка с файлом с тем же именем, которое пусто. – bob

+1

Затем либо вы имеете исключение, но не видите сообщение об ошибке, или 'genRand()' возвращает пустую строку, или метод никогда не вызывается. –

+0

Я печатаю свое исключение, поэтому я бы увидел, был ли он там, и, как я уже сказал выше, числа наиболее определенно генерируются, поскольку они отображаются в командной строке, когда оператор печати добавляется до 'return rand; '. И чтобы это произошло, метод должен был быть вызван: P. – bob

1

Вы вызываете неправильный метод. BufferedWriter.write(int) пишет только char. Проверьте Javadoc. Если вы хотите записать целое число в виде четырех байтов в двоичном, вам нужно DataOutputStream.writeInt(). Если вы хотите, чтобы записать его в виде строки, вам нужно BufferedWriter.write(""+People.genRand()),, возможно с последующим BufferedWriter.newLine().

0

Вы можете попытаться заполнить файл как следующий:

PrintWriter writer = null; 
try { 
    writer = new PrintWriter("peopleIDs.txt", "UTF-8"); 
    for (int i = 0; i < 100; i++) { 
     writer.println(genRand()); 
    } 
} catch (IOException ex) { 
    System.out.println(ex.getMessage()); 
} finally { 
    if(writer != null){ 
     writer.close(); 
    } 
} 
Смежные вопросы