هل يقوم Java Scanner ضمنيًا بإنشاء مخزن مؤقت حتى إذا لم تقم بتمريره؟

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

  •  20-09-2019
  •  | 
  •  

سؤال

إذا كان لدي ملف المثال التالي حيث يمثل كل رقم بايت (123 يحتوي على بايت 1 و2 و3):

123456789

لنفترض أنني قمت بإنشاء FileInputStream.يقرأ هذا في البايت الثنائي بالبايت.لذا فإن ‎.read()‎ يُرجع 1، ثم 2، وما إلى ذلك.الآن لنفترض أنني قمت بإنشاء مخزن مؤقت.القطعة الأولية التي يقرأها (إذا فهمت المخازن المؤقتة بشكل صحيح) هي 1-5.وهذا يسمح لها ليس فقط بالقراءة بالبايت بايت، ولكن في حالة الأحرف، سطور كاملة، وما إلى ذلك.ولكن إذا قمت بالضغط على .read() مرة أخرى، سأبدأ عند 6، وليس من حيث توقف BufferedReader (لذلك إذا كان الرقم 3 عبارة عن فاصل أسطر، وطلبت من BufferedReader طباعة السطر الأول، فإنه يطبع 1-2، ثم يستخدم .read() من FileInputStream يعطيني 6، وليس 3.)

لكي تتمكن من تحليل البيانات بواسطة المحدد، هل يقوم الماسح الضوئي ضمنيًا بإنشاء مخزن مؤقت مثل الطريقة التي يقوم بها BufferedReader بإنشاء مخزن مؤقت حتى يتمكن من العثور على فواصل الأسطر، وما إلى ذلك؟وإذا قمت بتمرير FileInputStream منفصل إلى الماسح الضوئي، فإن استخدام .read() لن يطبع البايت الأول بعد المحدد الأول الذي عثر عليه الماسح الضوئي، بل في نهاية "القطعة" التي أخذها الماسح الضوئي؟

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

المحلول

نعم.

من java.util.Scanner شفرة:

// Internal buffer used to hold input
private CharBuffer buf;

// Size of internal character buffer
private static final int BUFFER_SIZE = 1024; // change to 1024;

نصائح أخرى

وانها ليست واضحة، ولكن إذا نظرتم الى وثيقة API من الماسح الضوئي بعناية، ترى أنه يقوم على في Readable اجهة - ويستند الوسيلة الوحيدة في تلك الواجهة على العازلة. لذلك نعم، الماسح يخلق ضمنيا منطقة عازلة.

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