في الأقسام السابقة، تعلمنا عن تدفقات إدخال وإخراج بايت الملف وتدفقات إدخال وإخراج أحرف الملف. في هذا القسم، نتعلم مفهومًا جديدًا - التدفقات المخزنة مؤقتًا . إذن ما هو الدفق المخزن مؤقتًا؟ ما هو الدور الذي يمكن أن تلعبه التدفقات العازلة؟
في Java، نسمي الكائنات التي تم إنشاؤها بواسطة فئتي BufferedReader و BufferedWriter تدفقات الإدخال والإخراج المخزنة مؤقتًا، مما يعزز القدرة على قراءة الملفات وكتابتها. على سبيل المثال، Student.txt عبارة عن قائمة بالطلاب، حيث يشغل كل اسم سطرًا واحدًا. إذا أردنا قراءة الاسم، فيجب علينا قراءة سطر واحد في كل مرة، ومن الصعب إكمال مثل هذه المهمة باستخدام دفق FileReader، لأننا لا نعرف عدد الأحرف الموجودة في السطر، ولا نعرف فئة FileReader. توفير طريقة لقراءة السطر.
توفر Java تدفقات أكثر تقدمًا: دفق BufferedReader ودفق BufferedWriter، يجب أن يكون المصدر والوجهة لكليهما دفق إدخال الأحرف ودفق إخراج الأحرف. لذلك، إذا تم استخدام دفق إدخال أحرف الملف كمصدر لتدفق BufferedReader، وتم استخدام دفق إخراج أحرف الملف كوجهة لتدفق BufferedWriter، فإن التدفقات التي تم إنشاؤها بواسطة فئتي BufferedReader وBufferedWriter ستكون لها قراءة وكتابة أقوى القدرات من دفق إدخال الحرف وقدرة إخراج الحرف. على سبيل المثال، يمكن لتدفق BufferedReader قراءة الملفات سطرًا تلو الآخر.
منشئو فئة BufferedReader وBufferedWriter هم:
BufferedReader(Readerin);BufferedWriter(Writerout);
يمكن لتدفقات BufferedReader قراءة أسطر النص باستخدام readLine() . قم بإنشاء كائن BufferedReader عن طريق تمرير كائن من فئة Reader الفرعية، مثل مثيل FileReader، إلى BufferedReader، على سبيل المثال:
FileReaderinOne=newFileReader(Student.txt);BufferedReaderinTwo=BufferedReader(inOne);
ثم يستدعي تيار inTwo التابع readLine() لقراءة ملف Student.txt، على سبيل المثال:
StringstrLine=inTwo.readLine();
وبالمثل، يمكنك توصيل دفق BufferedWriter ودفق FileWriter معًا، ثم استخدام دفق BufferedWriter لكتابة البيانات إلى الوجهة، على سبيل المثال:
FileWritertofile=newFileWriter(hello.txt);BufferedWriterout=BufferedWriter(tofile);
ثم يستخدم out طريقة write(String s, int off, int len) من فئة BufferedReader لكتابة السلسلة s إلى hello.txt. المعلمة off هي الإزاحة من بداية s، وlen هو عدد الأحرف المكتوبة .
بالإضافة إلى ذلك، يمتلك مجرى BufferedWriter طريقة فريدة لكتابة حرف السطر الجديد في الملف:
newLine();
يمكن تسمية BufferedReader وBufferedWriter بالتيار العلوي، ويطلق على دفق الأحرف الذي يشيرون إليه الدفق الأساسي. تستخدم Java تقنية التخزين المؤقت لتوصيل الدفق العلوي والدفق الأساسي. يقرأ دفق إدخال الأحرف الأساسية البيانات في ذاكرة التخزين المؤقت أولاً، ثم يقرأ دفق BufferedReader البيانات من ذاكرة التخزين المؤقت؛ ويكتب دفق BufferedWriter البيانات في ذاكرة التخزين المؤقت، ويكتب دفق إخراج الأحرف الأساسية البيانات الموجودة في ذاكرة التخزين المؤقت بشكل مستمر إلى الوجهة. . عندما يستدعي دفق BufferedWriter فلوش () لتحديث ذاكرة التخزين المؤقت أو يستدعي طريقة الإغلاق () للإغلاق، حتى إذا لم تتجاوز ذاكرة التخزين المؤقت، فسيقوم الدفق الأساسي على الفور بكتابة المحتوى المخزن مؤقتًا إلى الوجهة.
ملحوظة : عند إغلاق دفق الإخراج، يجب عليك أولاً إغلاق دفق الإخراج المخزن مؤقتًا، ثم إغلاق الدفق المشار إليه بواسطة دفق الإخراج المخزن مؤقتًا، أي إغلاق الدفق العلوي أولاً ثم إغلاق الدفق السفلي. ما عليك سوى إغلاق الدفق العلوي عند كتابة التعليمات البرمجية، وسيتم إغلاق الدفق الأساسي للتيار العلوي تلقائيًا.
على سبيل المثال:
يتكون الملف english.txt من الجمل الإنجليزية كما يلي، كل جملة تشغل سطرًا واحدًا:
السهم أخطأ الهدف، رفضوا مطلب الاتحاد، إلى أين يتجه هذا الطريق؟
مطلوب قراءة ملف english.txt سطرًا تلو الآخر، وإضافة عدد الكلمات الموجودة في الجملة الإنجليزية بعد السطر، ثم كتابة السطر في ملف يسمى englishCount.txt، ويكون الكود كما يلي:
importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(Stringargs[]){FilefRead=newFile(english.txt);FilefWrite=newFile(englishCount.txt);try{Writerout=newFileWriter(fWrite);BufferedWrit erbufferWrite=newBufferedWriter(out);Readerin=newFileReader(fRead);BufferedReaderbufferRead=newBufferedReader(in);Stringstr=null;while((str=bufferRead.readLine())!=null){StringTokenizerfenxi=newStringTo kenizer(str);intcount=fenxi.countTokens();str=str+عدد الكلمات في الجملة:+count;bufferWrite.write(str);bufferWrite.newLine();}bufferWrite.إغلاق();out.إغلاق () ;in=newFileReader(fWrite);bufferRead=newBufferedReader(in);S trings=null;System.out.println(fWrite.getName()+content:);while((s=bufferRead.readLine())!=null){System.out.println(s);}bufferRead.إغلاق( );in. Close();}catch(IOExceptione){System.out.println(e.toString());}}}
نتائج التشغيل هي كما يلي:
englishCount.txt content:السهم أخطأ الهدف. عدد الكلمات في الجملة: 5 لقد رفضوا طلب الاتحاد. عدد الكلمات في الجملة: 5 إلى أين يذهب هذا الطريق؟ عدد الكلمات في الجملة: 6