web-dev-qa-db-ja.com

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

PrintWriterのメソッドがappend()と呼ばれるという事実は、開かれているファイルのモードを変更するという意味ではありません。

追加モードでもファイルを開く必要があります。

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

また、ファイルはシステムのデフォルトのエンコーディングで書き込まれることに注意してください。常に望ましいとは限らず、相互運用性の問題を引き起こす可能性があるため、ファイルエンコーディングを明示的に指定することもできます。

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

trueは追加フラグです。 ドキュメント を参照してください。

17
Stephan

次のコードのように、追加モードでファイルを開きます。

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

私見受け入れられた答えは、意図が文字を書くことであるという事実を考慮しません。 (私はこのトピックが古いことを知っていますが、同じトピックを探している間、アドバイスされた解決策を見つける前にこの投稿に出くわしたので、ここに投稿しています。)

FileOutputStream docs から、バイトを印刷する場合はFileOutputStreamを使用します。

FileOutputStreamは、画像データなどの生バイトのストリームを書き込むためのものです。文字のストリームを書き込むには、FileWriterの使用を検討してください。

また、 BufferedWriter docs から:

プロンプト出力が必要な場合を除き、FileWritersやOutputStreamWritersなど、write()操作にコストがかかる可能性のあるWriterをBufferedWriterでラップすることをお勧めします。

最後に、答えは次のようになります(前述のように この他の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);
}
9
marcelocra