PrintWriter-toevoegmethode wordt niet toegevoegd

De volgende methode schrijft alleen het laatste item dat ik heb toegevoegd weg, het wordt niet toegevoegd aan eerdere items. Wat doe ik verkeerd?

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

Antwoord 1, autoriteit 100%

Het feit dat de methode van PrintWriterappend()wordt genoemd, betekent niet dat de modus van het geopende bestand wordt gewijzigd.

U moet het bestand ook in de toevoegmodus openen:

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

Houd er ook rekening mee dat het bestand wordt geschreven in de standaard systeemcodering. Het is niet altijd gewenst en kan interoperabiliteitsproblemen veroorzaken. Misschien wilt u de bestandscodering expliciet specificeren.


Antwoord 2, autoriteit 17%

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

De trueis de append-vlag. Zie documentatie.


Antwoord 3, autoriteit 13%

Open het bestand in toevoegmodus, zoals met de volgende code:

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

Antwoord 4, autoriteit 13%

IMHO het geaccepteerde antwoord houdt geen rekening met het feit dat het de bedoeling is om karakters te schrijven. (Ik weet dat het onderwerp oud is, maar aangezien ik tijdens het zoeken naar hetzelfde onderwerp dit bericht tegenkwam voordat ik de geadviseerde oplossing vond, plaats ik het hier.)

Van de FileOutputStreamdocs, gebruikt u FileOutputStreamwanneer u bytes wilt afdrukken.

FileOutputStream is bedoeld voor het schrijven van streams van onbewerkte bytes zoals:
afbeelding gegevens. Overweeg voor het schrijven van stromen van karakters het gebruik van
FileWriter.

Bovendien, van de BufferedWriterdocs:

Tenzij prompte uitvoer vereist is, is het raadzaam om een
BufferedWriter rond elke Writer wiens write()-bewerkingen mogelijk zijn
kostbaar, zoals FileWriters en OutputStreamWriters.

Ten slotte zou het antwoord het volgende zijn (zoals in dit andere StackOverFlow-berichtvermeld):

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

Vanaf Java 7 kunt u ook een try-with-resources-statement gebruiken. Nee
Eindelijk is het blok nodig voor het sluiten van de aangegeven resource (s) omdat
Het wordt automatisch afgehandeld en is ook minder uitgebreid:

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

Antwoord 5, Autoriteit 2%

U hoeft niet te dubbele buffering zoals weergegeven in alle andere antwoorden.
Je kunt gewoon doen

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

Other episodes