Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将object toString()写入文件,用Java整齐地格式化_Java_File Io - Fatal编程技术网

将object toString()写入文件,用Java整齐地格式化

将object toString()写入文件,用Java整齐地格式化,java,file-io,Java,File Io,我有一个多态HashSet,我想将该HashSet中每个对象的toString写入一个文件,以便按照打印到控制台时的格式进行格式化。我可以将所有内容写入文件,但每个对象都打印在一行上。我想让每个对象都以字符串的格式打印,每个字段都打印在新行上 任何帮助都将不胜感激。我已经尝试了很多方法,但这就是我目前的方法: public void employeeWriter(String fileName, HashSet<Employee> employees) { try {

我有一个多态HashSet,我想将该HashSet中每个对象的toString写入一个文件,以便按照打印到控制台时的格式进行格式化。我可以将所有内容写入文件,但每个对象都打印在一行上。我想让每个对象都以字符串的格式打印,每个字段都打印在新行上

任何帮助都将不胜感激。我已经尝试了很多方法,但这就是我目前的方法:

public void employeeWriter(String fileName, HashSet<Employee> employees)
{
    try
    {
        PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(fileName, false)));   

        for (Employee e : employees)
        {
            pw.println(e);
        }    
        pw.close();
    }
    catch (IOException e)
    {
        System.err.println("Error writing to file in employeeWriter()");
        e.printStackTrace();
    }
}

使用java.lang.System.lineSeparator代替\n。这样,它就可以在windows平台上写入。\r\n使用java.lang.System.lineSeparator而不是java.lang.System.lineSeparator。这样,它在windows平台上\r\n写入。

在toString方法中,您将使用\n作为行分隔符。但如果在不支持Unix行分隔符的程序中打开一个使用Unix行分隔符的文件,例如Windows上的记事本,则文本将显示在一行上

FileWriter的println方法正确地使用了特定于平台的行分隔符,这就是为什么您的单个员工条目显示在单独的行上,而不是toString方法中的员工详细信息,因为您在其中使用了固定的行分隔符

因此,这个问题的一个可能的解决方案是,按照Julian Ladisch的建议,在toString方法中为您的平台使用正确的线分隔符。

在toString方法中,您将使用\n作为线分隔符。但如果在不支持Unix行分隔符的程序中打开一个使用Unix行分隔符的文件,例如Windows上的记事本,则文本将显示在一行上

FileWriter的println方法正确地使用了特定于平台的行分隔符,这就是为什么您的单个员工条目显示在单独的行上,而不是toString方法中的员工详细信息,因为您在其中使用了固定的行分隔符



因此,这个问题的一个可能解决方案是按照Julian Ladisch的建议,为您的平台在toString方法中使用正确的行分隔符。

在try块中的for循环中有一个额外的semcolon。我相信是打字错误?你能给我们展示一下toString方法的实现吗?hagubear-是的,那是一个打字错误。Dev-我添加了super class Employee的toString。当我运行一个简化版本时,我得到了预期的输出。如果您使用的是Windows并使用记事本,请尝试使用其他文本编辑器。在try块中的for循环中有一个额外的符号。我相信是打字错误?你能给我们展示一下toString方法的实现吗?hagubear-是的,那是一个打字错误。Dev-我添加了super class Employee的toString。当我运行一个简化版本时,我得到了预期的输出。如果您在Windows上使用记事本,请尝试使用其他文本编辑器。感谢您的解释,我将尝试使用System.lineSeparator。我曾想过用PrintWriter打印每个字段,但随后我必须说明不同员工拥有的独特字段,这将破坏多态性的目的。哦,是的,我完全忘记了你在问题中提到多态性,更不用说:,我将从我的答案中编辑这一部分,所以我只是更改了所有的toString方法来实现java.lang.System.lineSeparator。是否有一种方法可以为\t执行类似的操作?我问这个问题的原因是,我还让这个员工数据显示在GUI的JTextArea上,GUI上的选项卡间距与文件上的间距不同。选项卡间距不是特定于平台的。据我所知,如何呈现选项卡取决于编辑器或gui组件配置。若你们需要固定大小的缩进,我想你们可以用空格代替。谢谢你们的解释,我会尝试使用System.lineSeparator。我曾想过用PrintWriter打印每个字段,但随后我必须说明不同员工拥有的独特字段,这将破坏多态性的目的。哦,是的,我完全忘记了你在问题中提到多态性,更不用说:,我将从我的答案中编辑这一部分,所以我只是更改了所有的toString方法来实现java.lang.System.lineSeparator。是否有一种方法可以为\t执行类似的操作?我问这个问题的原因是,我还让这个员工数据显示在GUI的JTextArea上,GUI上的选项卡间距与文件上的间距不同。选项卡间距不是特定于平台的。据我所知,如何呈现选项卡取决于编辑器或gui组件配置。我想若你们需要固定大小的缩进,你们可以用空格代替。
@Override
public String toString()
{
    String output = "\n\t--Employee--" + "\nName:" + "\t\t" + getName()
        + "\nTitle:" + "\t\t" + this.getClass().getSimpleName()
        + "\nID: " + "\t\t" + getId() + "\nHire Year:" + "\t\t"
        +  getHireYear() + "\nTax Rate:" + "\t\t"
        + percentFormatter.format(getTaxRate()) + "\nPay Before Taxes:"
        + "\t" + formatter.format(getWeeklySalaryBeforeTaxes())
        + "\nPay After Taxes:" + "\t"
        + formatter.format(getWeeklySalaryAfterTaxes())
        + "\nWeekly Taxes:" + "\t\t"
        + formatter.format(getWeeklyTaxes());

    return output;
}