57

以下方法只写出我添加的最新项目,它不会附加到以前的条目。我究竟做错了什么?

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

5 回答 5

103

PrintWriter' 方法被调用的事实append()并不意味着它改变了正在打开的文件的模式。

您还需要以附加模式打开文件:

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

另请注意,文件将以系统默认编码写入。它并不总是需要并且可能会导致互操作性问题,您可能需要明确指定文件编码。

于 2011-11-21T10:58:33.820 回答
18
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"),true));

true附加标志。请参阅文档

于 2011-11-21T10:58:38.613 回答
13

以追加模式打开文件,如下代码:

 PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true)); 
于 2011-11-21T10:59:40.373 回答
13

恕我直言,接受的答案没有考虑意图是写字符的事实。(我知道这个话题很老,但是因为在寻找相同的话题时我在找到建议的解决方案之前偶然发现了这篇文章,所以我在这里发帖。)

FileOutputStreamdocs中,您可以FileOutputStream在要打印字节时使用。

FileOutputStream 用于写入原始字节流,例如图像数据。要写入字符流,请考虑使用 FileWriter。

此外,来自BufferedWriter文档

除非需要快速输出,否则建议将 BufferedWriter 包装在任何 write() 操作可能成本高昂的 Writer 周围,例如 FileWriters 和 OutputStreamWriters。

最后,答案如下(如另一篇 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();
    }
} 

此外,从 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);
}
于 2014-09-06T04:47:15.240 回答
3

您不需要像所有其他答案中所示的那样加倍缓冲。你可以简单地做

PrintWriter pw = new PrintWriter(new FileWriter("persons.txt",true));
于 2020-01-26T10:37:24.587 回答