بجانب المقالة السابقة ، سنستمر في تعلم عمليات دفق البايت في Java.
ديكور المخزن المؤقتة دفق المخزن المؤقت/الإخراج
دفق الديكور هو في الواقع ملف IO استنادًا إلى نمط تصميم "وضع الديكور" ، ودفقنا المخزن المؤقت هو مجرد واحد منهم. دعونا نلقي نظرة.
قبل ذلك ، استخدمنا الملفات وقراءة التدفقات FileInputStream و FileOutputStream على حد سواء قراءة والكتابة من بايت القرص أو بايت ، والتي تستغرق وقتًا طويلاً للغاية.
يمكن لتيارنا المخزن المؤقت القراءة قبل عدد بايت سعة محددة من القرص في وقت واحد إلى الذاكرة ، وسيتم قراءة عمليات القراءة اللاحقة مباشرة من الذاكرة لتحسين الكفاءة. دعونا نلقي نظرة على التنفيذ المحدد للتيارات المخزنة:
دعنا نأخذ BufferedInputStream كمثال أولاً ، دعنا نذكر باختصار خصائصها الأساسية:
BUF هي مجموعة بايت تستخدم لقراءات التخزين المؤقت. سيتم ملء قيمتها بشكل مستمر عند قراءة الدفق ، ويمكن أن تستند عمليات القراءة اللاحقة مباشرة إلى هذه المجموعة المخزنة.
Default_Buffer_Size يحدد حجم المخزن المؤقت الافتراضي ، أي طول صفيف BUF. Max_Buffer_Size يحدد الحد الأعلى للمخزن المؤقت.
يشير العد إلى آخر مؤشر بايت صالح في الصفيف المخزن مؤقتًا. يشير نقاط البيع إلى موقع فهرس البايت التالي المراد قراءته.
تستخدم Markpos و Marklimit لتكرار عمليات القراءة.
بعد ذلك ، دعونا نلقي نظرة على العديد من مُنشئات BufferedInputStream:
public BufferedInputStream (inputStream in) {this (in ، default_buffer_size) ؛} public BufferedInputStream (inputStream in ، int size) {super (in) ؛ if (size <= 0) {refl new alficalArgumentException ("حجم المخزن المؤقت <= 0") ؛ } buf = new byte [size] ؛}بشكل عام ، يحتاج الأول فقط إلى المرور في مثيل InputStream "مزيج" واستخدام مخزن مؤقت للحجم الافتراضي. يمكن أن يشير الأخير صراحة إلى حجم المخزن المؤقت.
بالإضافة إلى ذلك ، يحفظ Super (in) مثيل InputStream هذا في حقل السمة من الفئة الأصل FilterInputStream ، ويتم إصدار جميع عمليات قراءة القرص الفعلية بواسطة مثيل InputStream هذا.
دعونا نلقي نظرة على أهم عمليات القراءة وكيف يتم ملء المخزن المؤقت.
إلقاء القراءة int () المزامنة العامة () {ioxception {if (pos> = count) {fill () ؛ if (pos> = count) return -1 ؛ } return getBufifopen () [pos ++] & 0xff ؛}أعتقد أن الجميع على دراية بهذه الطريقة بالفعل. يقرأ البايت التالي من الدفق ويعيده ، لكن التنفيذ في التفاصيل لا يزال مختلفًا قليلاً.
يشير العد إلى الموضع التالي لمؤشر البايت الصحيح في الصفيف المخزن المؤقت ، ويشير نقاط البيع إلى الموضع التالي لمؤشر البايت المراد قراءة. من الناحية النظرية ، لا يمكن أن يكون نقاط البيع أكبر من العد ، على الأكثر على قدم المساواة.
إذا كان POS مساويًا للعد ، فهذا يعني أنه تمت قراءة جميع البايتات الصالحة في صفيف المخزن المؤقت. في هذا الوقت ، يجب تجاهل البيانات "غير المجدية" في المخزن المؤقت ويتم إعادة تحميل مجموعة من البيانات الجديدة من القرص لملء المخزن المؤقت.
في الواقع ، طريقة التعبئة هي ما يفعله. يحتوي على الكثير من التعليمات البرمجية ، لذلك لن آخذك لتحليلها. إذا فهمت وظيفتها ، فربما يكون من السهل تحليل تنفيذها.
إذا كان POS لا يزال مساوياً للعد بعد استدعاء طريقة التعبئة ، فهذا يعني أن مثيل InputStream لم يقرأ أي بيانات من الدفق ، أي أنه لا توجد بيانات في دفق الملف للقراءة. لهذا ، انظر السطر 246 من طريقة التعبئة.
بشكل عام ، إذا تم ملء المخزن المؤقت بنجاح ، فستأخذ طريقة القراءة لدينا بايت مباشرة من المخزن المؤقت وإعادته إلى المتصل.
قراءة int المزامنة العامة (البايت B [] ، int Off ، int len) {// .....}هذه الطريقة هي أيضًا "معارف" ، ولم تعد لديها أي تفسير غير ضروري ، فإن التنفيذ متشابه.
يتم استخدام طريقة SKIP لتخطي عدد بايت بطول محدد لاستمرار قراءة دفق الملف:
Skip Long Skip (Long N) {// ......}شيء واحد يجب ملاحظته هو أن طريقة التخطي تحاول تخطي بايت ، ولكن ليس من الضمان تخطي بايت n. تقوم الطريقة بإرجاع العدد الفعلي للبايت. إذا كان العدد المتبقي من البايتات المتاحة في الصفيف المخزن مؤقتًا أقل من N ، فسيتم تخطي العدد الفعلي للبايتات التي يمكن تخطيها في الصفيف المخزن المخزن المؤقت.
أخيرًا ، دعنا نتحدث عن هذه الطريقة القريبة:
Void Close () يلقي iOexception {byte [] buffer ؛ بينما ((buffer = buf)! = null) {if (bufupdater.compareanset (this ، buffer ، null)) {inputStream input = in ؛ في = خالية ؛ if (input! = null) input.close () ؛ يعود؛ }.ستقوم الطريقة الإغلاق بإفراغ الدفق "المزيّز" ويدعو طريقه الإغلاق لإصدار الموارد ذات الصلة ، مما سيقوم في النهاية بمسح مساحة الذاكرة التي تشغلها مجموعة المخزن المؤقت.
يوفر BufferedInputStream إمكانات التخزين المؤقت للقراءة ، في حين توفر BufferedOutputStream إمكانات التخزين المؤقت للكتابة ، أي أن عمليات كتابة الذاكرة لن يتم تحديثها على الفور ، وسيتم حفظها مؤقتًا في المخزن المؤقت ، وسيتم كتابتها معًا عندما يكون المخزن المؤقت ممتلئًا.
بايت بايت محمي [] ؛ عدد int المحمي ؛
يمثل BUF المخزن المؤقت الداخلي ، ويمثل العد قدرة البيانات الفعلية في المخزن المؤقت ، أي عدد البايتات الفعالة في BUF ، بدلاً من طول صفيف BUF.
public bufferedoutputstream (outputStream out) {this (Out ، 8192) ؛} public BufferedOutputStream (outputStream Out ، int size) {super (out) ؛ if (size <= 0) {refl new alficalArgumentException ("حجم المخزن المؤقت <= 0") ؛ } buf = new byte [size] ؛}مع نفس فكرة التنفيذ ، من الضروري توفير مثيل دفق الإخراج OutputStream ، ويمكن أن يشير أيضًا بشكل انتقائي إلى حجم المخزن المؤقت.
تُلقي كتابة الفراغ المزامنة العامة (int b) ioException {if (count> = buf.length) {flushbuffer () ؛ } buf [count ++] = (byte) b ؛}ستتحقق طريقة الكتابة أولاً ما إذا كان بإمكان المخزن المؤقت استيعاب عملية الكتابة هذه. إذا تعذر بدء عملية كتابة القرص ، فسيتم كتابة جميع بيانات المخزن المؤقت إلى ملف القرص ، وإلا سيتم كتابة المخزن المؤقت إلى المخزن المؤقت أولاً.
بطبيعة الحال ، يوفر BufferedOutputStream أيضًا طريقة تدفق لتوفير واجهة للخارج ، أي أنه لا يتعين عليك الانتظار حتى يصبح المخزن المؤقت ممتلئًا قبل كتابة البيانات إلى القرص. يمكنك أيضًا استدعاء هذه الطريقة بشكل صريح لمسح المخزن المؤقت وتحديث ملفات القرص.
Flush void المتزامن العام () يلقي ioException {FlushBuffer () ؛ out.flush () ؛}فيما يتعلق بالتدفقات المخزنة ، يتم تقديم المحتوى الأساسي على النحو الوارد أعلاه. هذا دفق يمكن أن يحسن الكفاءة بشكل كبير. من خلال ذلك ، يمكن تقليل عدد وصول القرص ويمكن تحسين كفاءة تنفيذ البرنامج.
لن نناقش الكائن التسلسلي لتدفق الكائن/OutputStream و Decorator Date Datainput/OutputSream بناءً على الأنواع الأساسية. عندما نتعلم التسلسل ، سنناقش هذين تيار البايتان مرة أخرى.
يتم تخزين جميع الرموز والصور والملفات في المقالة في السحابة على جيثب:
(https://github.com/singleyam/overview_java)
يمكنك أيضًا اختيار التنزيل محليًا.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.