
snnlankrdsm
El siguiente método solo escribe el último elemento que he agregado, no se agrega a las entradas anteriores. ¿Qué estoy haciendo mal?
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) {...}
}

axtavt
El hecho de que PrintWriter
El método de se llama append()
no significa que cambie el modo del archivo que se está abriendo.
También debe abrir el archivo en modo de adición:
PrintWriter pw = new PrintWriter(new FileOutputStream(
new File("persons.txt"),
true /* append = true */));
También tenga en cuenta que el archivo se escribirá con la codificación predeterminada del sistema. No siempre se desea y puede causar problemas de interoperabilidad, es posible que desee especificar la codificación de archivos de forma explícita.
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"),true));
El true
es el indicador de adición. Ver documentación.

sumit singh
Abra el archivo en modo de adición, como con el siguiente código:
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true));

marcelocra
En mi humilde opinión, la respuesta aceptada no considera el hecho de que la intención es escribir caracteres. (Sé que el tema es antiguo, pero dado que mientras buscaba el mismo tema me encontré con esta publicación antes de encontrar la solución recomendada, la publico aquí).
Desde el FileOutputStream
documentostu usas FileOutputStream
cuando quieras imprimir bytes.
FileOutputStream está diseñado para escribir flujos de bytes sin procesar, como datos de imágenes. Para escribir flujos de caracteres, considere usar FileWriter.
Además, desde el BufferedWriter
documentos:
A menos que se requiera una salida rápida, se recomienda incluir un BufferedWriter alrededor de cualquier Writer cuyas operaciones write() puedan ser costosas, como FileWriters y OutputStreamWriters.
Finalmente, la respuesta sería la siguiente (como se menciona en esta otra publicación de StackOverFlow):
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();
}
}
Además, a partir de Java 7, puede usar una declaración de prueba con recursos. No se requiere un bloque finalmente para cerrar los recursos declarados porque se maneja automáticamente y también es menos detallado:
try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)))) {
out.println("the text");
}catch (IOException e) {
System.err.println(e);
}

neeraj kumar
No necesita duplicar el almacenamiento en búfer como se muestra en todas las demás respuestas. Simplemente puedes hacer
PrintWriter pw = new PrintWriter(new FileWriter("persons.txt",true));
.