هل من الممكن الوصول إلى الكائنات بشكل عشوائي في جافا؟

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

سؤال

في الأساس لدي ملف من كائنات السلسلة.لقد استخدمت جافا ObjectOutputStream لتخزين الكائنات.هل من الممكن الوصول إلى الكائنات (السلاسل) بشكل عشوائي، على سبيل المثال، إذا كنت أرغب في الوصول إلى الكائن الحادي عشر، فيمكنني الانتقال بطريقة ما إلى هذا الموقع دون الحاجة إلى استخدامه قراءة الكائن () 11 مرة للتكرار إلى هذا الموقع.وإذا أردت العودة مرة أخرى، فيمكنني القيام بذلك أيضًا، دون الحاجة إلى التكرار من البداية مرة أخرى.شكرًا.

كما هو مقترح، أعتقد أنه يمكنني بطريقة ما استخدام طريقة SkiBytes() لتحقيق نوع من الوصول العشوائي.على الرغم من أنني لا أستطيع ضمان أن الكائن ذو حجم ثابت، ولكن ماذا لو كان بإمكاني الاحتفاظ بمصفوفة من مواضع تلك الكائنات في الملف، يمكنني فقط استخدام هذا المصفوفة كفهرس وskipBytes() للوصول العشوائي.لذا تظل المشكلة قائمة، على أية حال، هل يمكنني معرفة حجم الأشياء عندما أكتبها فعليًا، حتى أتمكن من تسجيل موضعها بطريقة ما؟

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

المحلول

ال ObjectOutputStream في حد ذاته لا يمكنه فعل ذلك، لأنه أولاً لا يمكنه معرفة حجم الكائنات الموجودة في هذا الملف؛في الواقع، لا يمكنه حتى معرفة أن الكائنات من نفس النوع.

لو أنت تعرف على وجه اليقين أن الكائنات ذات حجم ثابت وتعرف هذا الحجم، ويمكنك الاستفادة من skipBytes() الطريقة - ولكني أشك بشدة في أنك تعرف ذلك حقًا.


يحرر:شكرًا لقبول إجابتي، ولكن (فقط أوضح الأمور):وكانت نيتي لإظهار طريقة واحدة هذا يمكن القيام به نظرا للمتطلبات التي ذكرتها، ولكن هذا ليس على الإطلاق على ما يرام ينبغي القيام به, ، في رأيي.:)

نصائح أخرى

الطريقة الوحيدة التي يمكنك القيام بها هي تخزين الكائنات بشكل منفصل في تدفقاتها الخاصة، إما داخل نفس الملف أو في ملفات مختلفة.

من المحتمل أن أبسط شيء يجب القيام به هو تخزين الكائنات الخاصة بك في قائمة، ثم اقرأ هذه القائمة في قراءة واحدة، والوصول إلى القائمة بشكل عشوائي.

هذا غير ممكن مع ObjectInputStream, ، إذا كنت بحاجة إلى الوصول العشوائي، فستحتاج إلى قراءة جميع الكائنات في مجموعة/مصفوفة تدعم الوصول العشوائي أولاً.

استخدام ObjectOutputStream لتخزين كائنات السلسلة هو مبالغة كاملة.لقد فكرت بالفعل في استخدام فهرس لمواقع البداية.فلماذا لا نقوم فقط بتخزين السلاسل مباشرة في الملف باستخدام ملف FileOutputStream - إما لفه في OutputStringWriter باستخدام ترميز ذو طول ثابت (حيث يكون عدد البايتات == طول السلسلة، ربما *2)، أو استخدم toBytes(encoding) على كل سلسلة على حدة ولاحظ طول صفائف البايت الناتجة.

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