Метод добавления PrintWriter не добавляется - PullRequest
45 голосов
/ 21 ноября 2011

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

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) {...}
}

Ответы [ 4 ]

85 голосов
/ 21 ноября 2011

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

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

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

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

17 голосов
/ 21 ноября 2011
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"),true));

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

12 голосов
/ 21 ноября 2011

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

 PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true)); 
9 голосов
/ 06 сентября 2014

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

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

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

Кроме того, из BufferedWriter документов :

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

Наконец, ответ будет следующим (как упоминалось в этом другомStackOverFlow post ):

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