Пустой файл после записи в него?

поэтому я пытался написать плагин Bukkit для моего друга, и по какой-то причине поколение конфигурации не работает. Код, о котором идет речь ниже, и я буду рад добавить любой код, который люди должны помочь мне с этим. Когда я запускаю программу, файл конфигурации, который был создан, заканчивается пустым. Тестовый файл в порядке (я проверил это, просто комментируя строку, которая удаляет файл), но как только я пытаюсь получить несколько строк, он терпит неудачу. Может кто-нибудь помочь?

PrintWriter out = new PrintWriter(new FileWriter(config));
out.println("########################################");
out.println("#  hPlugin is written by newbiedoodle  #");
out.println("########################################");
out.println("#   -----  Plugin config file  -----   #");
out.println("########################################");
out.println("NOTE: Do not edit the config file besides changing the values - it may result in errors.");
out.println("--------------");
out.println("Strikes before being banned?");
out.println("3");
out.println("Godmode?");
out.println("true");
out.println("First time running the plugin?");
out.println("true");
out.println("Curse protection?");
out.println("true");
out.println("Emergency shelter?");
out.println("true");
out.println("Path building?");
out.println("true");
out.println("Blocked words/phrases (Separate with comma)");
out.println("[censored]");
out.close();
System.out.println("Successfully wrote defaults to config");

все это заключено в цикл try / catch, чтобы поймать любые ошибки, которые могут появиться. У меня такое чувство, что я упускаю что-то очень очевидное, но я не могу найти, что это такое.

  • config это File объект с путем, который он должен иметь, поэтому я не думаю, что это так

  • у меня программа делает почти все отдельно, чтобы я мог точно сказать пользователю, где произошла ошибка, поэтому файл создается только за пределами try/catch.

3 ответов


вам нужно позвонить...

out.flush();

... прямо перед твоим звонком...

out.close();

издания использует буфер в памяти для более эффективного использования дисков. Вам нужно вызвать flush (), чтобы сообщить PrintWriter записать ваши данные.


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

закрыть вызовы флеш в этой ситуации, как PrintWriter использует BufferedWriter и другой класс Writer не буферизованы.

  251       public void flush() throws IOException {
  252           synchronized (lock) {
  253               flushBuffer();
  254               out.flush();
  255           }
  256       }
  257   
  258       public void close() throws IOException {
  259           synchronized (lock) {
  260               if (out == null) {
  261                   return;
  262               }
  263               try {
  264                   flushBuffer();
  265               } finally {
  266                   out.close();
  267                   out = null;
  268                   cb = null;
  269               }
  270           }
  271       }

нужно смыть или закрыть поток, когда вы закончите. Очень важно перед выходом. Close автоматически вызовет flush ().