Java PrintWriter追加方法未追加

Java PrintWriter追加方法未追加,java,printwriter,Java,Printwriter,下面的方法只写出我添加的最新项,它不会附加到以前的项中。我做错了什么 public void addNew() { try { PrintWriter pw = new PrintWriter(new File("persons.txt")); int id = Integer.parseInt(jTextField.getText()); String name = jTextField1.getText(); Strin

下面的方法只写出我添加的最新项,它不会附加到以前的项中。我做错了什么

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
是附加标志。请参阅。

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

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

IMPO接受的答案不考虑意图写字符的事实。(我知道这个主题很古老,但因为在搜索同一主题时,我在找到建议的解决方案之前偶然发现了这篇文章,所以我在这里发布。)

从中,当您想要打印字节时,可以使用
FileOutputStream

FileOutputStream用于写入原始字节流,例如 图像数据。编写字符流时,请考虑使用 文件编写器

此外,从以下方面:

除非需要提示输出,否则建议将 BufferedWriter围绕任何Writer,其write()操作可能是 昂贵,例如文件写入程序和OutputStreamWriter

最后,答案如下(如上所述):

另外,从Java7开始,您可以使用try with resources语句。不 最后,关闭已声明的资源需要块,因为 它是自动处理的,而且不太冗长:

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

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

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

这就像唤醒了沉睡的线,为此感到抱歉。但我有一个疑问。如果只给我文件对象,并且不允许我使用流类(例如FileOutputStream等),我将如何在文件中执行追加操作。我被允许的是:Printwriter pw=新的Printwriter(文件);:我尝试了append()、write()、print()。在这种情况下,是否有任何现成的追加方法。作为澄清,PrintWriter的“append()”方法指的是它追加到写入程序,即它本身,即它自己的输出流,而不是文件。关于@user1707035的问题,否,看起来,如果不使用OutputStream对象构造PrintWriter,就无法使用PrintWriter进行追加。这是因为PrintWriter在流实例化时打开流,并且只有支持File或filename作为参数的构造函数通过内部构造一个OutputStream对象(不带“append”参数)来打开文件。参考(文件):
PrintWriter pw = new PrintWriter(new FileWriter("persons.txt",true));