2017-01-18 19 views
0

Я просматриваю книгу Java и теперь на класс Formatter выводят в текстовый файл. Я добавил дополнительную строку кода для тестирования toString() в конце addRecords(), но он не работает. Почему это так?Java Formatter class toString() не работает

Кроме того, я немного смущен насчет closeFile() по адресу if (output != null), затем закройте файл. По моему мнению, я думал, что output уже отформатировал все входные данные в текстовый файл, так как он все еще не равен нулю, что заставляет меня опробовать toString() по адресу addRecords().

Заранее благодарен!

// Fig. 15.3: CreateTextFile.java 
// Writing data to a sequential text file with class Formatter. 
import java.io.FileNotFoundException; 
import java.lang.SecurityException; 
import java.util.Formatter; 
import java.util.FormatterClosedException; 
import java.util.NoSuchElementException; 
import java.util.Scanner; 

public class CreateTextFile 
{ 
    private static Formatter output; // outputs text to a file 

    public static void main(String[] args) 
    { 
     openFile(); 
     addRecords(); 
     closeFile(); 
    } 

    // open file clients.txt 
    public static void openFile() 
    { 
     try 
     { 
      output = new Formatter("clients.text"); // open the file 
     } 
     catch (SecurityException securityException) 
     { 
      System.err.println("Write permission denied. Terminating."); 
      System.exit(1); // terminate the program 
     } 
     catch (FileNotFoundException fileNotFoundException) 
     { 
      System.err.println("Error opening file. Terminating."); 
      System.exit(1); // terminate the program 
     } 
    } 

    // add records to file 
    public static void addRecords() 
    { 
     Scanner input = new Scanner(System.in); 
     System.out.printf("%s%n%s%n? ", 
      "Enter account number, first name, last name and balance.", 
      "Enter end-of-file indicator to end input."); 

     while (input.hasNext()) // loop until end-of-file indicator 
     { 
      try 
      { 
       // output new record to file; assumes valid input 
       output.format("%d %s %s %.2f%n", input.nextInt(), 
        input.next(), input.next(), input.nextDouble()); 
      } 
      catch (FormatterClosedException formatterClosedException) 
      { 
       System.err.println("Error writing to file. Terminating."); 
       break; 
      } 
      catch (NoSuchElementException elementException) 
      { 
       System.err.println("Invalid input. Please try again."); 
       input.nextLine(); // discard input so user can try again 
      } 

      System.out.println(output.toString()); 
      System.out.print("? "); 
     } // end while 
    } // end method addRecords 

    // close file 
    public static void closeFile() 
    { 
     if (output != null) 
      output.close(); 
    } 
} // end class CreateTextFile 

Вот вывод командной строки:

Введите номер счета, имя, фамилию и баланс.

Введите индикатор конца файла для завершения ввода.

? 100 Bob Blue 24.98 [email protected]

ответ

1

Я добавил в дополнительной строке кода для проверки toString() к концу addRecords(), но он не работает. Почему это так?

Работает. Но это не делает то, что вы, по-видимому, думаете, что оно делает/должно делать.

javadoc для Formatter.toString() говорит:

"Возвращает результат вызова toString() на место для выхода."

В этом случае вы создали Formatter, который пишет в BufferedWriter. Когда Formatter.toString() звонит toString() на BufferedWriter, он не возвращает вам материал, который вы написали в файл. Скорее, он возвращает вам то, что вернется Object.toString(). Это описано here.

Если вы хотите, чтобы ваше приложение Java распечатывало то, что было записано в файл, вам нужно будет его открыть, прочитать и скопировать содержимое в System.out. И прежде чем вы это сделаете, вам понадобится flush() или close()Formatter.

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

+0

Я вижу ... Так что о другом вопросе относительно 'input! = Null', затем close()'? – Scorpiorian83

+1

Эта часть вашего вопроса для меня не имеет смысла. Однако проблема может заключаться в том, что 'closeFile()' на самом деле вообще не вызван. Вы действительно должны использовать try-with-resources, чтобы гарантировать, что форматирование всегда закрыто. –

+0

О, да, возможно, потому что я в начале главы, поэтому автор пытается сделать это простым. в любом случае, это оператор if, который меня смущает, как «выход» не равен нулю? – Scorpiorian83

1

BufferedWriter использует реализацию по умолчанию toString() объекта. Возвращенная строка содержит имя класса и объекты hashCode().

Если вы хотите, чтобы строка, содержащая вывод, использовала String.format или StringWriter для форматирования вывода, прежде чем записывать его в файл.

Редактировать: Как упоминалось в других ответах, BufferedWriter используется внутри Formatter, когда он создан с именем файла. Formatter.toString() вызывает BufferedWriter.toString() в этом случае.

+0

Чтобы быть откровенным, я даже не вижу ничего в книге, в котором упоминается о BufferedWriter, но я посмотрю на благодарность doc! – Scorpiorian83

+1

@ Scorpiorian83 Я пропустил, что вы используете Formatter, а не BufferedWriter напрямую. В этом случае Formatter.toString() вызывает BufferedWriter.toString(). – josefx

+0

okie уверенный спасибо бутон! – Scorpiorian83

 Смежные вопросы

  • Нет связанных вопросов^_^