سؤال

1) كيف تعمل تدفقات مخزنة في الخلفية، كيف تختلف عن التدفقات العادية وما هي ميزة (ميزة) من استخدامها؟

2) DataInputStream هو أيضا بايت على أساس. لكنها لها طرق ل readLine(). وبعد ما هي النقطة هنا؟

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

المحلول

من BufferedInputstream Javadoc:

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

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

العكس هو ذلك صحيحا ل Bufferedouttleam.

Mark () وإعادة الضبط () يمكن استخدامها على النحو التالي:

1 BufferedInputStream bis = new BufferedInputStream(is);
2 byte[] b = new byte[4];
3 bis.read(b); // read 4 bytes into b
4 bis.mark(10); // mark the stream at the current position - we can read 10 bytes before the mark point becomes invalid
5 bis.read(b); // read another 4 bytes into b
6 bis.reset(); // resets the position in the stream back to when mark was called
7 bis.read(b); // re-read the same 4 bytes as line 5 into b

لشرح علامة / إعادة تعيين بعض المزيد ...

يتذكر BufferInputstream الموقع الحالي في المخزن المؤقت. كما تقرأ بايتات سيكون الموقف زيادة. ستحفظ مكالمة للعلامة (10) الوضع الحالي. ستستمر مكالمات لاحقة لقراءة في زيادة الوضع الحالي ولكن دعوة لإعادة التعيين ستعيد المرتبة الحالية إلى قيمتها عند استدعاء العلامة.

تحدد الوسيطة المتمثلة في تحديد عدد البايتات التي يمكنك قراءتها بعد إبطال علامة العلامة قبل إبطال وضع العلامة. بمجرد إبطال وضع العلامة، لم يعد بإمكانك إعادة تعيين "إعادة تعيين" للعودة إليه.

على سبيل المثال، إذا تم استخدام علامة (2) في السطر 4 أعلاه، فسيتم إلقاء IOException عند إعادة التعيين () عند السطر 6 حيث أن وضع العلامة قد تم إبطاله منذ قراءة أكثر من 2 بايت.

نصائح أخرى

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

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

من خلال IC I / O مخزن مؤقتا، يتم تمرير كل طلب قراءة أو كتابة مباشرة إلى نظام التشغيل. تيارات i / o المخزنة Java قراءة البيانات وكتابة البيانات إلى مخزن الذاكرة الخاصة بها (عادة صفيف بايت). يتم إجراء المكالمات إلى نظام التشغيل إلا عندما يكون المخزن المؤقت فارغا (عند القيام بالقراءة) أو المخزن المؤقت ممتلئا (عند الكتابة). إنها في بعض الأحيان فكرة جيدة تدفع المخزن المؤقت يدويا بعد النقاط الحرجة في طلبك.

نظرا لأن مكالمات API لنظام التشغيل قد تؤدي إلى الوصول إلى القرص ونشاط الشبكة وما شابه ذلك، فقد يكون هذا مكلفا للغاية. باستخدام المخازن المؤقتة إلى دفع نظام التشغيل الأصلي I / O إلى قطع أكبر في كثير من الأحيان يحسن الأداء بشكل كبير.

تيارات مخزنة بكتبها أو قراءة البيانات في أكبر chunks by - nomen est Omen - التخزين المؤقت. وبعد اعتمادا على الدفق الأساسي، يمكن أن يؤدي ذلك إلى زيادة الأداء بشكل كبير.

من java.io.bufferedoutputtream.جافادوكس:

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

لتقليل هذا النوع من النفقات العامة، تنفذ منصة Java تدفقات I / O مخزنة. تدفقات الإدخال المخزنة مؤقتا اقرأ البيانات من منطقة ذاكرة تعرف باسم المخزن المؤقت؛ يسمى API الإدخال الأصلي فقط عندما يكون المخزن المؤقت فارغا. وبالمثل، فإن تدفقات الإخراج المخزنة مؤقتا تكتب البيانات إلى المخزن المؤقت، ويسمى API الإخراج الأصلي فقط عندما يكون المخزن المؤقت ممتلئا.

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