次のメソッドは、追加した最新のアイテムのみを書き出し、以前のエントリには追加しません。何が間違っていますか?
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));
私見受け入れられた答えは、意図が文字を書くことであるという事実を考慮しません。 (私はこのトピックが古いことを知っていますが、同じトピックを探している間、アドバイスされた解決策を見つける前にこの投稿に出くわしたので、ここに投稿しています。)
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); }