Метод добавления PrintWriter не добавляется

Следующий метод записывает только последний элемент, который я добавил, он не добавляется к предыдущим записям. Что я делаю неправильно?

public void addNew() {
    try {
        PrintWriter pw = new PrintWriter(new File("persons.txt"));
        int id = Integer.parseInt(jTextField.getText());
        String name = jTextField1.getText();
        String surname = jTextField2.getText();
        Person p = new Person(id,name,surname);
        pw.append(p.toString());
        pw.append("sdf");
        pw.close();
    } catch (FileNotFoundException e) {...}
}

Ответ 1

Тот факт, что метод PrintWriter называется append(), не означает, что он изменяет режим открытого файла.

Вам также нужно открыть файл в режиме добавления:

PrintWriter pw = new PrintWriter(new FileOutputStream(
    new File("persons.txt"), 
    true /* append = true */)); 

Также обратите внимание, что файл будет записан в системное кодирование по умолчанию. Это не всегда желательно и может вызвать проблемы совместимости, вы можете явно указать кодировку файла.

Ответ 2

PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"),true));

true - это флаг добавления. См. документацию.

Ответ 3

Откройте файл в режиме добавления, например, со следующим кодом:

 PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true)); 

Ответ 4

IMHO принятый ответ не учитывает тот факт, что намерение состоит в том, чтобы писать символы. (Я знаю, что тема старая, но так как, ища ту же тему, я наткнулся на это сообщение, прежде чем найти рекомендуемое решение, я размещаю здесь.)

Из FileOutputStream docs вы используете FileOutputStream, когда хотите печатать байты.

FileOutputStream предназначен для записи потоков необработанных байтов, таких как данные изображения. Для записи потоков символов рассмотрите возможность использования FileWriter.

Кроме того, из BufferedWriter docs:

Если приглашение не требуется, рекомендуется BufferedWriter вокруг любого Writer, чьи операции write() могут быть таких как FileWriters и OutputStreamWriters.

Наконец, ответ будет следующим (как упоминалось fooobar.com/info/14105/...):

PrintWriter out = null;
try {
    out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)));
    out.println("the text");
}catch (IOException e) {
    System.err.println(e);
}finally{
    if(out != null){
        out.close();
    }
} 

Кроме того, с Java 7 вы можете использовать оператор try-with-resources. нет блок finally необходим для закрытия объявленного ресурса (-ов), потому что он обрабатывается автоматически, а также менее подробен:

try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)))) {
    out.println("the text");
}catch (IOException e) {
    System.err.println(e);
}