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