以下方法只会写出我添加的最新项目,而不会追加到以前的条目中。我在做什么错?
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) {...}
}
PrintWriter
的方法称为append()
的事实并不意味着它会更改正在打开的文件的模式。
您还需要以附加模式打开文件:
PrintWriter pw = new PrintWriter(new FileOutputStream(
new File("persons.txt"),
true /* append = true */));
还请注意,文件将以系统默认编码写入。并非总是如此,它可能会导致互操作性问题,您可能需要显式指定文件编码。
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"),true));
true
是附加标志。参见documentation。
以附加模式打开文件,如以下代码所示:
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true));
恕我直言,接受的答案没有考虑到意图是写字符这一事实。 (我知道这个话题很旧,但是由于在寻找相同的话题时,我偶然发现了这篇文章,然后才找到建议的解决方案,我在这里发表。)
从FileOutputStream
docs,要打印字节时使用FileOutputStream
。
FileOutputStream用于写入原始字节流,例如图像数据。要编写字符流,请考虑使用FileWriter。
此外,来自FileOutputStream
:
除非需要提示输出,否则建议将任何其write()操作可能为Writer的Writer周围的BufferedWriter昂贵,例如FileWriters和OutputStreamWriters。
最后,答案将是以下(如BufferedWriter
docs所述:]
BufferedWriter
此外,从Java 7开始,您可以使用try-with-resources语句。没有需要finally块来关闭已声明的资源,因为它是自动处理的,也不太冗长:
in this other 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();
}
}