وظائف الإدخال والإخراج في لغة Java قوية للغاية ومرنة ، ويتم تنفيذ عمليات الإدخال والإخراج للبيانات بطريقة "دفق". يوفر J2SDK مجموعة متنوعة من فئات "الدفق" للحصول على أنواع مختلفة من البيانات ، المحددة في الحزمة java.io. البيانات هي الإدخال أو الإخراج في البرنامج من خلال الطرق القياسية.
يمكن تصنيف التدفقات في جافا من وجهات نظر مختلفة:
وفقًا لاتجاه الدفق: يتم تقسيمه إلى دفق الإدخال ودفق الإخراج.
وفقًا لوحدات البيانات المختلفة: يتم تقسيمها إلى دفق البايت (8 بت) ودفق الأحرف (16 بت).
وفقا لوظائف مختلفة: مقسمة إلى تدفق العقدة وتدفق المعالجة.
تدفق العقدة: هو تدفق (مثل الملف والذاكرة) يمكنه قراءة وكتابة البيانات من مصدر بيانات معين (العقدة). إنه مثل أنبوب واحد متصل بالحنفية ويبدأ في إطلاق الماء.
معالجة التدفق: إنه "متصل" على دفق موجود (تدفق العقدة أو تدفق المعالجة) ، مما يوفر للبرنامج وظائف قراءة وكتابة أكثر قوة من خلال معالجة البيانات. مثلما هو الحال على أساس توصيل أنبوب (تدفق العقدة) ، يتم وضع بعض الأنابيب الأكثر سمكا والوظيفة الخاصة (تدفق المعالجة) على معالجة مزيد من المياه الخارجة.
جميع أنواع الدفق التي توفرها J2SDK الموجودة في الحزمة java.io ترث أنواع الدفق المجردة الأربعة التالية.
تحتوي التدفقات الأربعة الأساسية لـ InputStream و OutputStream والقارئ والكاتب على فئات فرعية أكثر تحديدًا ، والتي يتم تقسيمها إلى تدفقات الملفات ، وتدفقات المخزن المؤقت ، ودارات البيانات ، ودارات التحويل ، ودفقات الطباعة ، وتدفقات الكائنات ، وما إلى ذلك ، وكلها تحتوي على وظائف محددة أو تستخدم لتشغيل بيانات محددة. من بينها ، تمثل الألوان الداكنة تدفق العقدة ، وتمثل الألوان الفاتحة تدفق المعالجة.
نلخص هنا الاستخدام المحدد للتدفق من خلال تدفق العقدة وتدفق المعالجة.
تصنيف تدفقات العقدة:
ملفات تدفقات العقدة (ملف) ، صفيف (صفيف في الذاكرة) ، السلسلة (السلسلة) ، والأنابيب (الأنابيب) على التوالي.
تصنيف تدفقات المعالجة:
تتضمن تدفقات المعالجة الشائعة الاستخدام: دفق المخزن المؤقت ، دفق التحويل ، دفق البيانات ، دفق الكائن ، ودفق الطباعة.
دفق مخزنة: يجب أن يتم توسيعه على دفق البايت المقابل ، ويوفر وظيفة التخزين المؤقت للبيانات القراءة والمكتوبة ، مما يحسن كفاءة القراءة والكتابة ، ويضيف أيضًا بعض الأساليب الأكثر ملاءمة.
وظيفة تدفق المخزن المؤقت مثل دلو. تدفق البايت الأصلي هو أنبوب مياه. يتم توصيل أنبوب الماء مباشرة بالوجهة. بعد إضافة تدفق المخزن المؤقت ، يتم توصيل دلو تحت أنبوب الماء ثم سكبها في الوجهة بعد أن تمتلئ الجرافة بالماء. يلعب دور التخزين المؤقت. وبهذه الطريقة يمكنك قراءة المزيد من البيانات في وقت واحد ، وتجنب القراءة والكتابة المتكررة إلى القرص الثابت. نظرًا لأنه يحتوي على وظيفة التخزين المؤقت ، فأنت بحاجة إلى استخدام طريقة التدفق عند كتابة البيانات.
استيراد java.io.*؛ الفئة العامة testbufferstream {public static void main (string [] args) {try {bufferedWriter bw = new BufferedWriter (new filewRiter ("f: //java//io/dat.txt") FileReader ("f: //java//io/dat.txt")) ؛ // دفق مخزنة على دفق البايت على سلسلة ملفات القراءة s = null ؛ لـ (int i = 1 ؛ i <= 100 ؛ i ++) {s = string.valueof (math.random ()) ؛ // iss s to bw.write (s) ؛ // اكتب s إلى ملف dat.txt bw.newline () ؛ // اكتب حرف كسر الخط. طريقة أفضل لاستخدام التدفقات المخزنة هي كتابة أو قراءة صف من البيانات. } bw.flush () ؛ // اجعل جميع البيانات في الذاكرة يتم كتابةها على الفور ولم تعد مخزنة. بينما ((s = br.readline ())! = null) {// اقرأ محتوى الملف بواسطة السطر system.out.println (s) ؛ } bw.close () ؛ // أغلق تدفق المعالجة وأغلق تدفق العقدة في الداخل. br.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}} تحويل التدفق: استخدم التحويل مع بيانات البايت إلى بيانات الأحرف. يتطلب InputStreamReader مقبس InportStream ، ويتطلب OutputStreamWriter مقبس OutputStream.
تدفق البيانات: DatainputStream و DataOutputStream يوفران الكتابة أو قراءة نوع البيانات الأساسية في ملف. هذا الدفق ذو فائدة كبيرة. إذا لم يكن هناك مثل هذا الدفق ، فهناك فترة طويلة لا تستغرق سوى 8 بايت. إذا كنت أرغب في الكتابة إلى الملف ، فأنا بحاجة إلى تحويله إلى سلسلة ثم تحويله إلى صفيف أحرف ، ستستغرق المساحة الكثير. ومع ذلك ، مع هذا التيار ، فهو مريح للغاية. ما عليك سوى كتابة هذه البايتات الـ 8 إلى الملف ، مما لا يحفظ مساحة الذاكرة فحسب ، بل يجعل البرنامج أكثر ملاءمة وبساطة. ومع ذلك ، تحتاج إلى الانتباه عند القراءة. وفقًا لنوع البيانات التي تقرأها ، سينتقل المؤشر إلى الأسفل ، لذلك يجب أن يكون الطلب الذي تقرأه متسقًا مع ترتيب الكتابة لتحقيق احتياجاتك الصحيحة. وإلا فإنه يعادل تقسيم البيانات.
استيراد java.io.*؛ الفئة العامة testDatastream {public static void main (string [] args) {bytearrayoutputstream baos = new bytearrayoutputstream () ؛ // إنشاء تدفق عقدة. DataOutputStream DOS = جديد DataOutputStream (BAOS) ؛ // قم بتوصيل دفق البيانات "أنبوب" على دفق العقدة ، حاول {dos.writedouble (Math.Random ()) ؛ // نوع مزدوج ، 8 بايت dos.writeboolean (صواب) ؛ // boolean type ، يحتل bytebytierrayinputstream bais = جديد bytearrayinputstream (baos.tobytearray ()) ؛ system.out.println (bais.availiverse ()) ؛ // إجمالي عدد البايتات المتاحة في دفق الإخراج-9 datainputstream dis = جديد datainputstream (BAIS) ؛ // أيضًا قم بتوصيل دفق البيانات "الأنابيب" خارج نظام دفق الإخراج. // read road Out the double type number system.out.println (dis.readBoolean ()) ؛ // readly read Out the Boolean type dos.close () ؛ dis.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}}
دفق طباعة: Java.io يوفر تدفقات للطباعة. يحتوي هذا النوع من الدفق على وظيفة التنظيف تلقائيًا عند الكتابة ، لذلك ليست هناك حاجة للتغلب في كل مرة تقوم فيها بطباعة شيء ما.
استيراد java.io.*؛ الفئة العامة testPrintStream1 {public static void main (string [] args) {printstream ps = null ؛ حاول {fileOutputStream fos = new FileOutputStream ("f: //java//io/log.dat") ؛ // إنشاء دفق الإخراج وحدد موقع الإخراج ps = new printstream (fos) ؛ // حزمة دفق الطباعة خارج دفق} catch (ioException e) {E.PrintStackTrace () ؛ } if (ps! = null) {system.setout (ps) ؛ // قم بتعيين طباعة النظام لطباعة دفق ps} int ln = 0 ؛ لـ (char c = 0 ؛ c <= 60000 ؛ c ++) {system.out.print (c+"") ؛ // عدم الطباعة على نافذة DOS ، تتم طباعة دفق الإخراج مباشرة في الملف المحدد إذا (ln ++> = 100) {system.out.println () ؛ ln = 0 ؛ }}}}