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 PrintWriter
append()
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 true
is 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 FileOutputStream
docs, gebruikt u FileOutputStream
wanneer 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 BufferedWriter
docs:
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));