يستخدم java.io أنماط التصميم مثل وضع تزيين وضع المحول لحل المقبس والمشكلات ومخرجات تدفقات الأحرف.
لا يمكن لدفق البايت معالجة بايت واحد إلا في وقت واحد ، ومن أجل تسهيل تشغيل البيانات ، تتم إضافة دفق المقبس.
مقدمة المشكلة:
لماذا يعتبر الدفق المخزّن أكثر كفاءة من تدفقات بايت الملف العادية؟
للعمليات دون التخزين المؤقت ، يجب كتابة بايت واحد لكل بايت قراءة.
نظرًا لأن عمليات IO التي تنطوي على الأقراص أبطأ بكثير من عمليات الذاكرة ، فإن التدفقات دون التخزين المؤقت غير فعالة للغاية.
يمكن لدفق مع المخزن المؤقت قراءة العديد من البايتات في وقت واحد ، لكنه لا يكتب إلى القرص ، ولكن يتم وضعه في الذاكرة أولاً.
عندما يكون لديك حجم مخزن مؤقت كافي ، اكتبه على القرص في وقت واحد. يمكن أن تقلل هذه الطريقة من عدد عمليات القرص وستكون السرعة أعلى بكثير!
هذا هو الفرق بين الاثنين.
ربما العملية:
إذا لم يكن هناك منطقة ذاكرة التخزين المؤقت ، فكل مرة تقرأ فيها ، سيتم إرسال عملية IO ؛
هناك منطقة ذاكرة التخزين المؤقت. عندما تقرأ في المرة الأولى ، سيتم قراءة X Bytes ووضعها في منطقة التخزين المؤقت. ثم سيتم قراءة القراءات اللاحقة من ذاكرة التخزين المؤقت. عندما تقرأ حتى نهاية منطقة ذاكرة التخزين المؤقت ، سيتم قراءة X Bytes مرة أخرى ووضعها في منطقة ذاكرة التخزين المؤقت.
من الواضح أن الطريقة الثانية ستقلل من عمليات IO وتكون أكثر كفاءة. العيب هو أنه يستهلك المزيد من الذاكرة.
تم تصميم تدفقات الإدخال والإخراج Java باستخدام تغليف متعدد الطبقات
تعتمد أدنى مستوى InputStream و OutputStream على تدفقات البايت وليس لها آلية ذاكرة التخزين المؤقت. يتم تغليفها بشكل عام واستخدامها بعد الاستخدام بواسطة BufferInputStream و BufferOutputStream.
طريقة قراءة BufferInputStream تمنع الخيط. ستقرأ BufferInputStream.Read (BUF) جميع دفق الإدخال في BUF قبل العودة.
bufferOutputStream.write (buf) ؛ سوف يخرج المحتويات في BUF إلى دفق الإخراج ، ولكن تذكر أن تدفق ؛
هناك أيضًا طباعة PrintStream و PrintWriter سهلة الاستخدام يمكن تحديثها تلقائيًا ، ولكن بالنسبة لتيارات البايت.
يتم استخدام تدفقات البايت عمومًا لنقل الملفات الثنائية وغيرها من تدفقات الأحرف. غالبًا ما يتم لفها بالقارئ.
أكثرها استخدامًا هو BufferInputStreamReader و Printwrinter. طريقة readline لـ BufferInputStreamReader عملية للغاية وسوف تتدفق تلقائيًا عند المواجهة /r /d.
PrintWrinter طالما تم تعيين خاصية Refresh على True في المُنشئ ، يمكن تحديث طريقة PrintLn تلقائيًا دون تدفق.
FilterInputStream و FilterOutputStream: مرشح تدفق وتدفق العازلة وتدفق البيانات كلاهما ورث من هنا.
بالنسبة لتيارات العازلة ، سيتم نقل البيانات حقًا إلى دفق الإخراج فقط عندما يكون المخزن المؤقت ممتلئًا ، ولكن يمكن استخدام طريقة Flush () لإرسال البيانات من المخزن المؤقت غير المملوء بشكل مصطنع ؛ لا يمكن تحديد طريقة الترميز للملف ومن الصعب تطبيقها على الشبكة.
الأكثر شيوعًا في الممارسة العملية هو أن دفق البيانات يمكن أن يسمح للمرسل والمستقبل بالمعالجة وفقًا لنفس الترميز.
DataInputStream و DataOutputStream: يمكن قبول سطر من البيانات ، أو يمكن أن يشفرها ، أو يمكن أن يكون دفقًا على مقبس ، يمكن أن يكون دفق بايت ملف ودفق الشبكة ، ويجب أن يكون ترتيب القراءة والكتابة متسقًا ، وإلا فإن استثناء سيحدث عند القراءة.
يتم استخدام DataInputStream لتزيين تدفقات الإدخال الأخرى ، والتي "تتيح للتطبيقات قراءة أنواع بيانات Java الأساسية من دفق الإدخال الأساسي بطريقة مستقلة عن الجهاز." يمكن للتطبيقات استخدام DataOutputStream لكتابة البيانات التي تقرأها DatainputStream.
ما ورد أعلاه هو دفق دفق دفق الدفق java.io java.io. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!