Java Formatter类toString()不起作用

时间:2017-01-18 10:54:50

标签: java tostring formatter

我正在阅读一本Java书籍,现在将Formatter类输出到一个文本文件中。我添加了一行额外的代码来测试toString()addRecords()的末尾,但它确实无效。为什么会这样?

此外,我对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 java.io.BufferedWriter@55f96302

2 个答案:

答案 0 :(得分:1)

BufferedWriter使用Object中的默认toString()实现。返回的String包含类名和对象hashCode()

如果您希望包含输出的字符串使用String.formatStringWriter来格式化输出,然后再将其写入文件。

编辑:如其他答案所述,当使用文件名创建BufferedWriter时,格式化程序会在内部使用BufferedWriter。 Formatter.toString()在这种情况下调用BufferedWriter.toString()。

答案 1 :(得分:1)

  

我添加了一行额外的代码来测试toString()addRecords()的末尾,但它不起作用。为什么会这样?

它正在发挥作用。但它并没有做你认为应该做的事情。

Formatter.toString()的{​​{3}}说:

  

“返回在输出目标上调用toString()的结果。”

在这种情况下,您创建了一个写入Formatter的{​​{1}}。当BufferedWriterFormatter.toString()上调用toString()时,它不会回复您写入文件的内容。相反,它会返回BufferedWriter将返回的内容。这被描述为javadoc

如果您希望Java应用程序打印出已写入文件的内容,则需要打开它,读取它并将内容复制到System.out。在您这样做之前,您需要Object.toString()flush() close()

更简单的想法是在应用程序完成后使用文本编辑器或Formatter命令或类似的...查看文件。如果文件为空或比预期的短,请确保您的应用程序始终在终止前关闭less