java serialization، enjectionInputstream.ReadObject ()، تحقق مما إذا كان سيتم حظره

StackOverflow https://stackoverflow.com/questions/1501378

  •  19-09-2019
  •  | 
  •  

سؤال

أنا أستخدم A. ObjectInputStream للإتصال readObject للقراءة في المسلسل Objects. وبعد أود تجنب وجود كتلة الطريقة هذه، لذلك أنا أتطلع إلى استخدام شيء مثل Inputstream.available().

InputStream.available() سوف اقول لك هناك البايتات المتاحة وهذا read() لن تمنع. هل هناك طريقة معادلة ل Seriailzation التي ستخبرك إذا كان هناك Objectالمتاحة و readObject لن يمنع؟

هل كانت مفيدة؟

المحلول

رقم على الرغم من أنه يمكنك استخدام ObjectInputStream في مؤشر ترابط آخر وتحقق لمعرفة ما إذا كان هذا يحتوي على كائن متاح. عموما الاقتراع ليس فكرة رائعة، خاصة مع ضمانات سيئة InputStream.available.

نصائح أخرى

لم يتم تصميم API تسلسل Java لدعم available() وظيفة. إذا قمت بتطبيق وظائف قارئ الكائنات / الكاتب الخاصة بك، فيمكنك قراءة أي كمية من البيانات قبالة الدفق الذي تريده، ولا توجد طريقة للإبلاغ.

لذا readObject() لا يعرف مقدار البيانات التي سيقرأها، لذلك لا يعرف عدد الكائنات المتاحة.

كما اقترح المنشور الآخر، فإن أفضل رهان لديك هو نقل القراءة إلى مؤشر ترابط منفصل.

لدي فكرة أنه من خلال إضافة آخر inputtream إلى سلسلة واحدة يمكن أن تجعل معلومات التوفر مقروءة من قبل العميل:

هاك

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 كتل (= ينتظر حتى) عند عدم قراءة الإدخال. لذلك إذا كان هناك أي مدخلات على الإطلاق في تيار AKA إذا كان (bis.available ()> 0) ObjectInPutstream.ReadObject لن يمنع. ضع في اعتبارك أن ObjectInPutstream.ReadObject قد يرمي ClassnotfoundException، وهذا ليس مشكلة على الإطلاق بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top