2011-11-21 19 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

これは、睡眠のスレッド、そのためにとても残念を目覚めさせるようなものです。しかし、私は疑いがあります。 Fileオブジェクトだけを与えられ、Streamクラス(FileOutputStreamなど)を使用することが許可されていない場合、ファイル内で操作を追加するにはどうすればよいですか。私は許可されている:Printwriter pw =新しいPrintWriter(ファイル);私はappend()、write()、print()を試しました。このシナリオで追加するためのレディメイドメソッドがありますか? –

+0

説明として、PrintWriterの 'append()'メソッドは、それがWriter、すなわちそれ自体に追加されているという事実を参照しています。それは自分の出力ストリームであり、ファイルではありません。 –

+0

そして、@ user1707035の質問を参照すると、PrintStreamを使用してOutputStreamオブジェクトで構築することなく追加することはできないようです。これはPrintWriterがインスタンス化時にストリームを開き、引数としてFileまたはfilenameをサポートするコンストラクタだけが、 'append'パラメータなしでOutputStreamオブジェクトを内部的に構築することによってFileを開くためです。リファレンス(docs):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を使用。

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

また、BufferedWriter docsから:プロンプトの出力が必要とされない限り

、FileWritersとOutputStreamWriterのよう 、高価なものであってもよい、その書き込み()操作任意ライタ周り BufferedWriterのをラップすることが推奨されます。

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ブロックは、それが自動的に処理され ので、宣言リソース(複数可)を閉鎖するために必要とせず、またそれほど冗長です:

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