11

する

 final OutputStream output = new FileOutputStream(file);

file既に存在する場合は切り捨てますか? 驚くべきことに、Java 6 の API ドキュメントには記載されていません。Java 7 の API ドキュメントも同様です。言語自体の仕様は、FileOutputStreamクラスのセマンティクスについて何も述べていません。

私はそれを知っています

 final OutputStream output = new FileOutputStream(file, true);

ファイルへの追加を引き起こします。しかし、追加と切り捨てが唯一の可能性ではありません。1000 バイトのファイルに 100 バイトを書き込むと、最後の 900 バイトがそのまま残る可能性があります。

4

3 に答える 3

3

Windows 2008 x86およびJava 1.6.0_32-b05でこれを試しました

同じファイルに文字「b」の 1Mb と文字「a」の 4Mb を継続的に書き込む 2 つのプロセスを作成しました。私が使用しない限り

out = new RandomAccessFile(which, "rw");
out.setLength(0);
out.getChannel().lock();

私は、3 番目のリーダー プロセスが、1Mb の 'b' で始まり、その後に 'a' が続くファイルのように見えるものを読み取ることができることを発見しました

最初に一時ファイルに書き込み、次に名前を変更することがわかりました

File.renameTo

ファイルへも機能しました。

2番目のプロセスによって読み取られている可能性のあるファイルを切り捨てるために、WindowsのFileOuputStreamに依存しません...

  • 新しくない FileOutputStream(ファイル)
  • FileOutputStream(file, false) (切り捨てられません)
  • または

これ;

out = new FileOutputStream(which, false);
out.getChannel().truncate(0);
out.getChannel().force(true);

でも

out = new FileOutputStream(which, false);
out.getChannel().truncate(0);
out.getChannel().force(true);
out.getChannel().lock();

動作します

于 2013-03-18T18:49:44.663 に答える
-3

FileOutputStreamほとんどの場合上書きされるバイナリデータを書き込むためのものです。

テキストデータを操作する場合は、FileWriter便利appendなメソッドを持つ を使用することをお勧めします。

于 2013-03-13T14:10:36.890 に答える