以下方法仅写出我添加的最新项目,它不会附加到以前的条目。我做错了什么?
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) {...}
}
答案 0 :(得分:84)
PrintWriter
的方法被称为append()
这一事实并不意味着它改变了正在打开的文件的模式。
您还需要以追加模式打开文件:
PrintWriter pw = new PrintWriter(new FileOutputStream(
new File("persons.txt"),
true /* append = true */));
另请注意,文件将以系统默认编码方式写入。它并不总是需要并且可能导致互操作性问题,您可能希望明确指定文件编码。
答案 1 :(得分:17)
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"),true));
true
是附加标志。请参阅documentation。
答案 2 :(得分:12)
以附加模式打开文件,如下面的代码所示:
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true));
答案 3 :(得分:9)
恕我直言,接受的答案并没有考虑到意图是写字的事实。 (我知道这个话题已经过时了,但是因为在搜索同一主题时我偶然发现了这个帖子,然后才找到建议的解决方案,我在这里发帖。)
从FileOutputStream
docs开始,如果要打印字节,请使用FileOutputStream
。
FileOutputStream用于写入原始字节流,例如 图像数据。要编写字符流,请考虑使用 FileWriter的。
此外,来自BufferedWriter
docs:
除非需要提示输出,否则建议包装 BufferedWriter围绕任何write()操作可能的Writer 昂贵的,例如FileWriters和OutputStreamWriters。
最后,答案如下(如上所述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(); } }
此外,从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); }
答案 4 :(得分:2)
您不需要像其他所有答案中所示的那样加倍缓冲。 您只需完成
PrintWriter pw = new PrintWriter(new FileWriter("persons.txt",true));