2014-11-23 6 views
1

У меня есть полиморфный HashSet, который я хочу написать toString() каждого объекта в этом HashSet в файл, так что он отформатирован так, как он выглядит при печати на консоль. Я могу написать все в файл, но каждый объект печатается на одной строке. Я хотел бы, чтобы каждый объект печатался так, как форматируется toString() (каждое поле напечатано в новой строке).Запись объекта toString() в файл, аккуратно отформатированный в Java

Любая помощь будет принята с благодарностью. Я попытался кучу вещей, но это то, что я в настоящее время для моего метода:

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(); 
    } 
} 

Вот Сотрудник ToString() - Каждый ребенок Employee имеет свой собственный метод ToString() метод, который печатает этот ToString () плюс свои собственные уникальные поля.

@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; 
} 
+0

У вас есть дополнительный семколон внутри цикла for в блоке try. typo, я верю? – ha9u63ar

+1

Можете ли вы показать нам реализацию метода 'toString()', пожалуйста? – Dev

+0

hagubear - да, это была опечатка. – user2827811

ответ

1

Вместо \ n используйте java.lang.System.lineSeparator(). Таким образом, он пишет \ r \ n на платформах Windows.

4

В методе toString вы используете \n в качестве разделителей линий. Но если вы откроете файл, который использует разделители строк Unix в программе, которая их не поддерживает (например, «Блокнот в Windows»), текст будет отображаться в одной строке.

println метод FileWriter правильно использует специфичные для платформы разделители строк, поэтому ваши индивидуальные данные работника появляются на отдельных строках, но не детали работника от toString() метода, потому что вы используете фиксированные \n разделительную линию там.

Таким образом, одним из возможных решений этой проблемы является использование правильных разделителей линий для вашей платформы в методе toString (используйте System.lineSeparator(), как было предложено Джулианом Ладишем).

+0

Спасибо за это объяснение, я попробую использовать System.lineSeparator(). Я думал о печати каждого поля с помощью PrintWriter, но тогда мне пришлось бы учитывать уникальные поля, которые есть у разных сотрудников, которые могли бы превзойти цель полиморфизма. – user2827811

+0

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

+0

Итак, я только что изменил все свои методы toString() для реализации java.lang.System.lineSeparator(). Есть ли способ сделать что-то подобное для \ t? Причина, по которой я спрашиваю, есть ли у меня данные Employee, отображаемые в JTextArea графического интерфейса, а интервал между вкладками в графическом интерфейсе отличается от интервала в файле. – user2827811

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