التدفقات هي مفهوم مجردة لتسلسل البايت.
الملفات هي أشكال تخزين ثابت للبيانات ، بينما تشير التدفقات إلى النموذج عند إرسال البيانات.
تنقسم فئات الدفق إلى فئتين رئيسيتين: فئات دفق العقدة وفئات التيار المصفاة (تسمى أيضًا فئات دفق العملية).
يسمى الفئة المقابلة للجهاز الهدف فئة تدفق العقدة. يمكن للبرنامج أيضًا استدعاء فئة تدفق العقدة من خلال فئة تدفق غير مباشرة لتحقيق قراءة أكثر مرونة ومريحة لأنواع مختلفة من البيانات. فئة التدفق غير المباشرة هذه هي فئة تدفق المرشح (تسمى أيضًا فئة تدفق المعالجة) ، أو فئة التغليف.
عملية استدعاء فئة الغلاف هي كما يلي:
العلاقة بين تصنيف التدفق
بغض النظر عن مدى ثراء وتعقيد تصنيف التدفقات ، تأتي جذورها من أربع فصول أساسية. العلاقة بين هذه الفئات الأربع هي كما يلي:
| تيار بايت | دفق الشخصية | |
| دفق الإدخال | InputStream | قارئ |
| دفق الإخراج | OutputStream | الكاتب |
يقوم Unicode بتشفير الأحرف المخزنة في Java ، وفئة معالجة دفق الأحرف هي المسؤولة عن تحويل تدفقات الأحرف المشفرة الخارجية الأخرى وتدفقات أحرف Unicode في Java. الفئات InputStreamReader و OutputStreamWriter مع التعامل مع تدفقات الأحرف وتيارات البايت. دفق الأحرف (يمكنه التعامل مع المخزن المؤقت في وقت واحد) أكثر كفاءة في عملية واحدة من دفق البايت (بايت واحد في وقت واحد).
InputStream
نظرًا لأن inputstream و outputstream من الفئات التصويت ، لا يمكنهم الإشارة إلى جهاز IO الذي يتوافق معه. هناك العديد من الفئات الفرعية التي تحتها ، بما في ذلك أجهزة IO محددة مثل الشبكات وخطوط الأنابيب والذاكرة والملفات ، وما إلى ذلك ، وكائنات الفئات الفرعية المختلفة المستخدمة في البرامج الفعلية.
ملاحظة: نسمي مصدر IO والهدف المقابل لفئة تدفق العقدة The Dream Node (Node).
ملاحظة: عند كتابة محتويات الملف A إلى ملف B ، يستخدم البرنامج فئة الإخراج أو فئة الإدخال لتشغيل الملف أ.
OutputStream
قارئ الدفق الموجهة نحو الطابع
يعني الدفق الموجهة بواسطة أحرف Unicode القراءة من الدفق أو كتابة المعلومات في الدفق بأحرف Unicode. وبالمثل ، فإن القارئ/الكاتب يعتنع عن الفصل.
قارئ
الكاتب
إعادة استخدام رمز برنامج IO:
عادةً ، عند كتابة رمز ، استخدم -1 كإدخال لوحة المفاتيح ، ولا تستخدم System.in مباشرة في الوظيفة المكتوبة. إنه فقط عند استدعاء الوظيفة ، يتم تمرير System.in كمعلمة. وبهذه الطريقة ، عندما نريد قراءة البيانات من ملف في المستقبل لاستبدال إدخال لوحة المفاتيح اليدوي ، يمكننا استخدام هذه الوظيفة مباشرة ، لذلك لا يحتاج البرنامج إلى إجراء الكثير من التعديلات ، وذلك لتحقيق تأثير عدم التغيير والتكيف مع التغييرات.
تحويل تدفقات البايت وتيارات الأحرف
InputStreamReader و OutputStreamReader: قم بتحويل دفق موجه بايت إلى دفق موجه نحو الأحرف.
فئة InputStreamReader هي جسر من دفق بايت إلى دفق حرف: يقرأ في البايتات ويحوله إلى دفق حرف وفقًا لطريقة الترميز المحددة.
قد يتم تحديد طريقة الترميز المستخدمة بالاسم ، أو طريقة الترميز الافتراضية المقبولة للنظام الأساسي.
قد تتسبب كل مكالمة في إحدى طرق read () لـ inputStreamReader في قراءة بايت أو أكثر من قراءتها من دفق إدخال البايت الأساسي.
من أجل تحقيق كفاءة أعلى ، فكر في تغليف InputStreamReader مع BufferedReader.
BufferedReader في = جديد bufferedReader (new inputStreamReader (system.in)) ؛
ملخص لاستخدام تدفق Java
لقد واجهت العديد من تيارات Java في عملي الأكثر احترافًا ، والملخص كما يلي:
1. إنشاء تنسيق مضغوط. ما تواجهه هو إنشاء ملفات zip في servlet ، وإخراجها إلى عميل الويب ، وتنزيلها مباشرة.
استجابة. Response.addHeader ("Disposition" ، "المرفق ؛ filename =/" xxx.zip/ "") ؛ zipoutputStream Out = new zipoutputStream (response.getOutputStream ()) لـ () {zipentry entry = new zipentry ("aa" + i ".dat") ؛ out.putnewentry (الدخول) ؛ بايت [] bt = s.getBytes () ؛ out.writeBytes (bt ، 0 ، bt.length ()) ؛ out.closeentry () ؛ } out.flush () ؛ out.close () ؛ ZipoutputStream وراثي من java.io.filteroutputstream. لذلك ، تتم كتابة عملية الكتابة الحقيقية من خلال المعلمة OutputStream Out.
كتابتها الفارغة (byte [] B ، int Off ، int len) تدعو أخيرًا. write (B ، Off ، Len) ؛
إذا كنت ترغب في إنشاء ملف مضغوط ، فاكتب ZipoutputStream جديدة (FileOutputStream (PATH) الجديد) ؛
2. كتابة مماثلة XML.
XMLWriter Writer = New XMLWriter (FileOutputStream (PATH) ، Formatter)
الكاتب. write (doc). المبدأ يشبه ما سبق
3. اكتب الملفات النصية وأضفها.
printstream ps = new printstream (fileOutputStream جديد (مسار ، صحيح) ، "utf-8") ps.println (s) ؛ // يمكن أن تكتب أنواعًا مختلفة مثل Boolean ، Int ، إلخ.يرث PrintSteam أيضًا من FilterOutputStream
DataOutputStream Out = جديد dataOutputStream (socket.getOutputStream ()) ؛ Out.WriteBytes (BT) ؛ Out.WriteBoolean (Boolean V) ؛
DataOutputStream هو أيضا filterOutputStream.
5. اقرأ من النص
BufferedReader Reader = جديد BufferedReader (New FileReader (path)) ؛ reader.ReadLine () ؛
نمط BufferredReader هو نفس نمط المرشح أعلاه. إنه يخزن كائنًا يتم تمرير كائن القارئ كمعلمة واستخدامها للقراءة بالفعل.
الفئة المقابلة لـ Java 1.0 من BufferedReader هي BufferedInputStream ، وهو مرشح.
6. اقرأ من المقبس
BufferedInputStream هو = جديد bufferedInputStream (Socket.getInputStream ()) ؛ is.read (bt ، 0 ، bt.length ()) ؛
تلخيص:
سلسلة دفق الفئة الأساسية هي inputstream و outputstream. إنها فئات مجردة والطرق الوحيدة المطلوبة هي (خذ الإخراج كمثال)
باطلة الكتابة (int b) يلقي ioexception ؛ باطلة الكتابة (البايت ب []) يلقي ioexceptionvoid الكتابة (البايت ب [] ، int ، int len)
الشيء الأساسي هو عملية البايت. يبدو أن الطريقة الأولى تكتب عددًا صحيحًا ، لكنها في الواقع تكتب بايت واحد فقط (أدنى ثمانية بتات). تنقسم فئة الفئة الفرعية إلى سلسلتين ، أحدهما هو تشغيل جهاز الإخراج مباشرة. ما واجهناه أعلاه هو ملف (FileOutputStream) وإخراج Servlet (ServleToutPutStream). أخرى شائعة الاستخدام هي أيضا bytearrayoutputstream ، والتي يتم تشغيلها مباشرة في الذاكرة.
التالي هو سلسلة FilterOutputStream ، التي تتلقى معلمة مقعد كائن OutputStream ، ويتم الانتهاء من عملية الكتابة الحقيقية من خلال الكائن. على سبيل المثال ، ZipoutputStream مسؤول فقط عن إنشاء بيانات مضغوطة. بالنسبة إلى ما إذا كانت هذه البيانات مكتوبة إلى الملف أو الذاكرة أو ServleTResponse ، يتم تحديدها بواسطة معلمات الإدخال. هذا هو نمط الديكور.
تتضمن العمليات الشائعة الاستخدام في سلسلة Filter PrintStream (توفير الطباعة ، println ، الكتابة (Boolean [int ، char ، string]) ، وأخيراً باستخدام طريقة Out.write لكتابتها بالبايت.
هناك أيضًا DataOutputStream ، والذي يوفر WriteByte/WriteBoolean/Writedouble/WriteLong/WiRetutf وطرق أخرى.
هناك أيضًا مقبس/ZIP وأشياء أخرى غير شائعة الاستخدام.
تدفق جافا مريح للغاية ومعقد. التعقيد يعني أن تطبيق الوظيفة غالباً ما يتطلب فئات متعددة ، وهناك مجموعات متعددة. لا يزال يتعين تلخيصه في الممارسة العملية.