Java直列化ObjectInputStream.readObject()チェック、ブロック
-
19-09-2019 - |
質問
を使用している ObjectInputStream
電話 readObject
読み直列化された Objects
.たいと思いる必要性を回避するためにこの方法をブロック、を探しているものを使っておけば間違いないように Inputstream.available()
.
InputStream.available()
まだまりバイト数が read()
まずブロックです。があるのと同等の方法seriailzationことをお伝えする場合があり Object
s利用可能 readObject
ませんか
解決
はありません。あなたは別のスレッドでObjectInputStream
を使用し、それが可能なオブジェクトがあるかどうかをチェックすることもできますが。一般的にポーリングは特にInputStream.available
の貧しい保証で、素晴らしいアイデアではありません。
他のヒント
JavaのシリアライゼーションAPIはavailable()
機能をサポートするように設計されていませんでした。あなたがあなた自身のオブジェクトのリーダ/ライタ機能を実装する場合は、あなたが好きストリームからデータの任意の量を読み取ることができ、そして何の報告方法はありません。
だから、readObject()
が、それは読んでどのくらいのデータを知らないので、それが利用可能であるか、多くのオブジェクトを知りません。
、あなたの最善の策は、別のスレッドに読書を移動することです。
申し訳ありませんでした。るようInputStreamのチェーンになってしまうことが可用性情報を読み、クライアント:
HACK!
InputStream is = ... // where we actually read the data
BufferedInputStream bis = new BufferedInputStream(is);
ObjectInputStream ois = new ObjectInputStream(bis);
if( bis.available() > N ) {
Object o = ois.readObject();
}
の難点は価値N.べきであるのに十分な大きさでも直列化ヘッダおよびオブジェクトデータです。場合は変化の激しい、展開しております。
にBufferedInputStreamは私のために働く、そしてなぜちょうど(bis.available()> 0)の代わりに、N値、これは私のために完璧に動作するか確認していません。 入力が読み取られるべきではない場合、私は(=まで待機)ObjectInputStream.readObjectブロックを考えます。だから、(bis.available()> 0)ObjectInputStream.readObjectがブロックされません場合は、ストリーム内のすべてのいずれかの入力が別名がある場合。 ObjectInputStream.readObjectは、ClassNotFoundExceptionがスローかもしれないことに注意してください、それは私には全く問題がis't。