2009-08-06 8 views
3

テキストファイルを作成したいのですが、ファイルがすでに存在する場合は、新しいファイルを作成すべきではありませんが、既存のファイルの内容(最後)にテキストを追加する必要があります。どのように私はJavaでそれを行うことができますか?私は読むのをやめて、再び私は、ファイルが既にチェックファイルが存在するjava

が、私は条件をチェックする必要がない存在する場合、私は同じファイルに書き込む必要があり、その時点でのデータを読み始めたとき、私は入力ストリームからデータを読んでいる1秒ごとのため

if(file.exists){ 

} else{ 
    new File(); 
} 

私は何をすればよいですか?

+0

あなたの質問は明確ではありませんが、既に存在する場合はファイルに追加したいと思いますか? – Kirtan

+0

はい、すでに存在する場合にファイルに追加したい –

答えて

12

あなたは既に存在するファイルに追加するには、次のコードを使用することができます - そして、バイトはファイルの終わりではなく、に書き込まれます、FileWriter'sコンストラクタの第二引数がtrueある場合

try { 
    BufferedWriter out = new BufferedWriter(new FileWriter("filename", true)); 
    out.write("data"); 
    out.close(); 
} catch (IOException e) { } 

始まり。

スティーブンさんのコメント引用:第二 引数としてtrueを渡す

が...それは存在せず、それが存在しない場合は追加用に をオープンする場合 作成するファイルを原因とします。

+2

正確には、2番目の引数として 'true'を渡すと、ファイルが存在しない場合は作成され、存在する場合は追加のために開かれます。 –

+1

これがこの問題にアプローチする最善の方法です。他のすべてのチェック・アンド・クリスト・メソッドは、非アトミック・ファイル操作のために失敗する可能性があります。ほとんどのシステムでは、append-create操作はアトミックです。 FileOutputStreamクラスは、正しい操作であるFileDescriptorを追加モードで直接設定します。 – brianegge

10

私は条件に if(file.exists){ }else{ new File(); }

をチェックしなければならないのはありません、あなたはそれを行う必要はありません。解決のための他の回答を参照してください。それはあなたのアプリケーションを作るかもしれない潜在的な競合状態を作成するよう

実際に、...死ぬかのファイルを壊し時折、そのような何かをする悪い考えだろう!

file.exists()呼び出しがfalseを返した直後に、オペレーティングシステムがアプリケーションを先取りして別のアプリケーションに制御を渡したとします。次に、他のアプリケーションがファイルを作成したとします。アプリケーションがオペレーティングシステムによって再開されると、ファイルが作成されたことを認識せず、それ自体を作成しようとします。状況によっては、既存のファイルが壊れる可能性があります。または、ファイルの競合が原因でこのアプリケーションがIOExceptionをスローする可能性があります。

なお、​​は実際にはファイルシステムオブジェクトを作成しません。それはあなたがファイルを開くときにのみ起こります。例えばnew FileOutputStream(file);

1

既に存在する場合にファイルに追加したい場合は、その存在を確認する必要はありません。exists()を使用してください。 appendフラグをtrueに設定してFileWriterを作成するだけで済みます。例えば

PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("foo.txt", true))); 
pw.println("Hello, World"); 
pw.close(); 

ファイルが存在しない場合は作成されます。そうでない場合は、ファイルの末尾に追加されます。

関連する問題