Java IO هي نقطة معرفة كبيرة.
إذا قمت بتفكيك نقاط معرفتها وتحدثت عنها ، فمن المحتمل أن يكون أسبوعًا. بالنسبة لنظام IO ، يمكنك إلقاء نظرة على الصورة التالية.
بعد ذلك ، لنبدأ بمجموعة من الكود ، دعنا نلقي نظرة على الكود التالي
اختبار الفئة العامة {public static void main (string [] args) يلقي استثناء {file file = new file ("text.txt") ؛ if (! file.exists ()) {file.createNewFile () ؛ } fileOutputStream fos = fileOutputStream (ملف جديد) ؛ BufferedOutputStream BOS = جديد BufferEdoutputStream (FOS) ؛ بايت [] ب = بايت جديد [1024] ؛ Bos.Write (B) ؛ bos.flush () ؛ }} يتم إنشاء دفق مخزنة في الكود ، ثم يتم كتابة بيانات طول KB في الدفق ، وأخيراً تسمى طريقة Flush ().
هذا جزء بسيط للغاية من التعليمات البرمجية ، والإخراج النهائي هو إنشاء ملف نص 1 كيلو بايت.
ولكن إذا علقت السطر الأخير
//bos.flush () ؛
سيصبح حجم النص النهائي الذي تم إنشاؤه هو 0.
هذه النتيجة واضحة للغاية ، ولكن إذا قمنا بتغيير Flush () لإغلاق () ، فهل ستظل النتيجة 0؟
حول تدفق
تم العثور على Flush () بالفعل في نقل الشبكة منذ وقت طويل
في ذلك الوقت ، من أجل الكفاءة ، لن ينقل الخادم والعميل جزءًا من البيانات في كل مرة يتم إنشاؤها.
بدلاً من ذلك ، سيتم إنشاء المخزن المؤقت وسيتم نقل البيانات إلى العميل بعد امتلاء المخزن المؤقت.
في بعض الأحيان هناك مثل هذه المشكلة. عندما لا تكون البيانات كافية لملء المخزن المؤقت ويجب نقل البيانات إلى العميل ، من أجل حل هذه المشكلة ، هناك مفهوم للتدفق ، ويتم إجبار البيانات العازلة على إرسالها.
بالعودة إلى السؤال أعلاه ، هل من الممكن استبدال التدفق بإغلاق
الجواب نعم.
إذا نظرت إلى الكود المصدر ، فستعرف علاقة الميراث بـ BufferedOutputStream
الطبقة العامة BufferOutputStream يمتد FilterOutputStream
لا يقوم BufferEdoutputStream بتنفيذ طريقة Close () ، لذلك سوف يستدعي مباشرة الإغلاق () من FilterOutputStream ، وستقوم طريقة FilterOutputStream بإغلاق () لإخراج بيانات المخزن المؤقت.
في التطوير الفعلي ، فيما يتعلق بعمليات IO ، يتم التأكيد على أنه يجب استدعاء طريقة الإغلاق () في النهاية. المثال أعلاه هو أحد الأسباب.