0

サーバーがファイル作成のためにディレクトリを監視するスレッドを開く単純なクライアントサーバーアプリケーションをプログラミングしています。これらのファイルはシリアル化されたオブジェクトです。スレッドはそれらをデシリアライズし、データを読み取り、新しいオブジェクトを作成してクライアントに送信する必要があります。したがって、一般的にはかなりうまく機能しますが、時々次のようになります。

java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315) で java.io.ObjectInputStream.readObject(ObjectInputStream.java: 369) ServerSend.start(ServerSend.java:58) で ServerSend.run(ServerSend.java:25) で java.lang.Thread.run(Thread.java:722) で

しかし、なぜこれが起こっているのですか?なぜ時々だけ...私がオブジェクトを読んだプログラムの一部:

FileInputStream fileStream = new FileInputStream(dirpath+"/"+t);
ObjectInputStream ois = new ObjectInputStream(fileStream);
Object toSend = ois.readObject();

ペーストビンのソースコード

他のいくつかのプログラムがこれらのオブジェクトを作成し、私の StreamReader が読みたい:

FileOutputStream fileStream = new FileOutputStream(filepath_to_where_listening);
            ObjectOutputStream oos = new ObjectOutputStream(fileStream);
            oos.writeObject(mmout);
4

2 に答える 2

1

そのファイルはアトミックに作成されていますか? または、作成中にファイルを読んでいる可能性はありますか?

拡張子を付けてファイルを作成し.tmp(たとえば)、ファイルが完成したら拡張子を削除することができます。使用中のファイルシステムに依存しますが、これはほとんどの (すべての?) Unix/Linux ファイルシステムでアトミックであると予想されます。

または、書き込みプロセスでファイルを書き込んでから、対応するフラグ ファイルを書き込んで、シリアル化されたオブジェクトの書き込みが終了したことを示すこともできます (例: objectfile.serand objectfile.ser.done) 。

別の解決策 (非常に非決定論的) は、ファイルを監視し、指定された時間待ってから読み取ることで、ファイルの作成が完了するようにすることです。

于 2012-11-02T15:07:16.623 に答える
1

は、2 つの条件によって引き起こされる可能性があります。

  • ファイルが適切に閉じられなかったため、ファイルの末尾が切り捨てられました。ファイルが破棄された場合、GC はファイルを閉じることができますが、この動作は信頼できません。
  • Xxxx は Yyyy ではありません。たとえば、writeObject と readInt でこのエラーが発生します。
于 2012-11-02T15:07:53.793 に答える