2011-11-21 76 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); 
}