57

次のメソッドは、追加した最新のアイテムのみを書き出します。以前のエントリには追加しません。私は何を間違っていますか?

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

5 に答える 5

103

PrintWriterメソッドが呼び出されappend()たからといって、開かれているファイルのモードが変更されるわけではありません。

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

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

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

于 2011-11-21T10:58:33.820 に答える
18
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"),true));

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

于 2011-11-21T10:58:38.613 に答える
13

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

 PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true)); 
于 2011-11-21T10:59:40.373 に答える
13

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

FileOutputStreamdocsから、FileOutputStreamバイトを出力したいときに使用します。

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

さらに、BufferedWriterドキュメントから:

迅速な出力が必要でない限り、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);
}
于 2014-09-06T04:47:15.240 に答える