2011-11-21 106 views
33

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

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

回答

64

PrintWriter的方法被称为append()并不意味着它改变了文件被打开的模式的事实。

您需要追加方式打开文件,以及:

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

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

+0

这就像唤醒沉睡的线程,对于很抱歉。但我有疑问。我如何做文件追加操作,如果我只给予文件对象,我不允许使用流类(例如FileOutputStream等)。我允许的是:Printwriter pw = new PrintWriter(file); :我试着append(),write(),print()。有没有现成的方法来追加这种情况。 – 2013-04-11 16:43:10

+0

作为澄清,PrintWriter的'append()'方法指的是它附加到Writer,即它本身i的事实。e它是自己的输出流,而不是文件。 –

+0

并且参考@ user1707035的问题,不,看起来您不能使用PrintWriter追加而不用OutputStream对象构造它。这是因为PrintWriter在实例化时打开了流,并且只有支持File或filename作为参数的构造函数通过在内部构造OutputStream对象而不使用“append”参数来打开文件。参考(文档):https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#PrintWriter(java.io.File) –

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

true是追加标志。见documentation

9

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

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

恕我直言接受的答案不考虑事实的意图是写字。 (我知道这个话题很古老,但是因为在搜索同一主题时,我偶然发现了这个帖子,所以我在这里发帖。)

FileOutputStream docs开始,当你想打印字节。

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

此外,从BufferedWriter docs

除非需要提示输出,最好是环绕任何作家,其写()操作的 的BufferedWriter可以是 昂贵,如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-与资源的语句。没有 finally块需要关闭,因为 它是自动处理的申报资源(S),也是更简洁:

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