Метод добавления 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);
}