Записать объект toString () в файл, аккуратно отформатированный в Java

1

У меня есть полиморфный HashSet, который я хочу записать toString() каждого объекта в этом 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();
    }
}

Вот Employee 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. опечатка я верю?
  • 1
    Можете ли вы показать нам реализацию метода toString() , пожалуйста?
Показать ещё 4 комментария
Теги:
file-io

2 ответа

4

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

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

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

  • 0
    Спасибо за это объяснение, я попытаюсь использовать System.lineSeparator (). Я думал о печати каждого поля с помощью PrintWriter, но тогда мне пришлось бы учитывать уникальные поля, которые есть у разных Сотрудников, что противоречило бы цели полиморфизма.
  • 0
    О, да, я полностью забыл, что вы упомянули полиморфизм в своем вопросе, не говоря уже о том, что :), я отредактирую эту часть из своего ответа.
Показать ещё 3 комментария
1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню