1. تدفقات الإدخال الأساسية وتيارات الإخراج <BR /> تدفق واحد من أهم المفاهيم الأساسية في Java. يتم استخدام قراءة الملفات والكتابة ، ونقل الشبكة واستقبالها ، والاتصال العملية ، والبث في جميع الأماكن تقريبًا التي تكون فيها الإدخال والمخرجات مطلوبة.
ما الذي يستخدم لدفق؟ إنه للمدخلات والمخرجات. لماذا تستخدم الإدخال والإخراج "دفق"؟ نظرًا لأن الوحدة الأساسية لإدخال وإخراج البرنامج هي بايت ، فإن الإدخال هو الحصول على سلسلة من البايتات ، والمخرج هو إرسال سلسلة من البايتات. ومع ذلك ، في كثير من الحالات ، من المستحيل على البرنامج أن يتلقى جميع البايتات قبل المعالجة ، ولكن لتلقي القليل من المعالجة. على سبيل المثال ، عند تنزيل World of Warcraft ، من المستحيل تنزيله جميعًا في الذاكرة وحفظه على القرص الثابت ، ولكن فقط قم بتنزيله وحفظه قليلاً. في هذا الوقت ، هذه الطريقة مناسبة للغاية.
في جافا ، كل دفق هو كائن. هناك نوعان من التدفقات: دفق الإدخال (InputStream) ودفق الإخراج (OutputStream). بالنسبة لتيار الإدخال ، تحتاج فقط إلى إخراج البايتات من الدفق ؛
كيف يتم الحصول على كائنات الدفق؟ الأنظمة الخارجية المختلفة لديها أيضًا طرق مختلفة للحصول على تدفقات. على سبيل المثال ، عند قراءة الملفات وكتابةها ، تحتاج إلى إنشاء كائن FileInputStream/FileOutputStream ، بينما يستخدم اتصال الشبكة كائنات المقبس للحصول على تدفقات الإدخال والإخراج. بشكل عام ، إذا كان لدى الفئة طرق مثل getInputStream () أو getOutputStream () ، فهذا يعني أنه يتم الإدخال والإخراج من خلال كائن دفق.
InportStream هو دفق إدخال.
استيراد java.io.file ؛ */ الفئة العامة readfiledemo {// إدخال البرنامج العام الثابت (string [] args) {string path = "c: /boot.ini" ؛ ؛ Byte [0] إذا كانت قيمة الإرجاع -1 ، فهذا يعني أنه لا يوجد محتوى للقراءة. بينما (في كل مرة! = -1) {// يتم وضع محتوى القراءة في المخزن المؤقت ، ودمجه الآن في المحتوى. concatbytearrays (المحتوى ، في كل مرة) ؛ PrintStackTrace () ؛ em. إرجاع نتيجة دمج حجم الحجم الأول من Bytes1 و Bytes2*/ البايت الثابت الخاص [] concatbytearrays (byte [] bytes1 ، byte [] bytes2 ، int sizeofbytes2) {byte [] resu lt = arrays.copyof (bytes1 ، bytes1 length + sizeofbytes2) ؛
على الرغم من أنه مطوّل للغاية ، إلا أنه في الواقع الاستخدام الأساسي لـ InputStream. لاحظ أن هذا مجرد مثال على كيفية قراءة سلسلة بايت من دفق الإدخال. في الواقع ، توفر Java طريقة أسهل لقراءة الملفات النصية. سيتم تقديمه لاحقًا.
يعد استخدام الإخراج OutputStream أمرًا بسيطًا جدًا من القراءة من دفق. هنا مثال:
استيراد java.io. SaveFileDemo {public static void main (string [] ()) {system.err.println ("لا يمكن إنشاء ملف.") ؛ ) .ToString () .getbytes ()) ؛ System.out.println ("كتابة الملفات.") ؛
توفر Java أيضًا عمليات دفق أخرى ، لكنها جميعها تمتد أو تمتد على inputstream و outputstream. لذلك هاتان الفئتان هما الأساس ويجب فهمهما.
2. القارئ والكاتب
يتم تقديم InputStream و OutputStream ، ثم يتم تقديم القارئ والكاتب. هاتان الفئتان في الواقع يلفون inputstream و outputstream. ومع ذلك ، فإنهم لا يعالجون بايت ، ولكن الشخصيات. إذا كانت المحتويات الموجودة في الدفق نصًا ، فسيكون من الأسهل معالجة مع القارئ/الكاتب. فيما يلي مثال على قراءة ملف نصي باستخدام القارئ:
استيراد java.io.filereader string path = "c:/boot.ini" ؛ اقرأ (Buffer))! = -1) {content += new String ( ) ؛
أما بالنسبة لكيفية استخدام الكاتب لكتابة محتوى نص في ملف ، فلن أقدم مثالاً هنا.
لا يزال المثال أعلاه ليس الطريقة الأكثر شيوعًا لقراءة الملفات النصية. يوفر Java عازلة Bufferreader ، والتي عادة ما نستخدمها لقراءة الملفات النصية. هنا مثال:
استيراد java.io.bufferedreader path = "c:/boot.ini" ؛ {content + = line + "/n" ؛ }
3. تسلسل الكائن <BR /> التسلسل الكائن هو أيضًا جانب مهم في تطبيقات التدفق. التسلسل هو تحويل كائن إلى سلسلة من البايتات ، والتي يمكن حفظها أو تمريرها إلى برنامج Java آخر للاستخدام. يتم استخدام ObjectOutputStream و ObjectInputStream خصيصًا للتسلسل والتسلسل. هنا مثال بسيط:
استيراد java.io. استيراد java.io.eofexception ؛ * يتم استخدام هاتين الفئتين للتسلسل والتسلسل على التوالي. */ SerializationDemo {public static void main (string [] args) استثناء {string path = "c: /persons.data" ؛ F.CreateNewFile () ؛ PATH) ؛ يتم حفظ الكائن إلى الملف المحدد الخاص بكتاب باطل باطل (مسار السلسلة) يلقي ioException {person [] persons = new شخص [] {شخص جديد ("Zhang San" ، 23) ، شخص جديد ("li si" ، 24)} ؛ ) ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////اف شخص تسلسلي {اسم السلسلة الخاصة ؛ الشخص العمومي () {} اسم سلسلة ، int) {this.name = name. الاسم =} int getage () Name + '/' ' + "، Age =" + Age +'} '؛
لا يمكن لهذا المثال قراءة ويكتب البايتات والأحرف ، لأن كلا الفئتين يتم تعبئتهم. ما سبق هو مجرد مثال بسيط ، ولا يزال هناك العديد من الأشياء التي يجب الانتباه إليها إذا كنت ترغب في كتابة التسلسل بشكل جيد. إذا كنت ترغب في الحصول على فهم أعمق للتسلسل ، فيمكنك التحقق من ذلك هنا. تركز هذه المقالة فقط على الأجزاء المتعلقة بالتدفق. في الواقع ، نادراً ما يتم استخدام التسلسل لأن التسلسل يقلل من المرونة ، لذلك لا يتم استخدامه عمومًا إذا لم تستخدمه.