من الدراسة السابقة، نعلم أنه إذا كنت ستقرأ ملفًا، فأنت بحاجة إلى إنشاء دفق إدخال يشير إلى الملف؛ وإذا كنت ستكتب ملفًا، فأنت بحاجة إلى إنشاء دفق إخراج يشير إلى الملف. لذا، هل يمكنك إنشاء دفق يمكنك من خلاله قراءة الملفات وكتابتها؟ هذا هو بالضبط ما يدور حوله هذا القسم حول التدفقات العشوائية.
يُطلق على الدفق الذي تم إنشاؤه بواسطة فئة RandomAccessFile اسم الدفق العشوائي . على عكس تدفقات الإدخال والإخراج السابقة، فإن فئة RandomAccessFile ليست فئة فرعية من فئة InputStream ولا فئة فرعية من فئة OutputStream. ومع ذلك، يمكن استخدام نقطة الدفق التي تم إنشاؤها بواسطة فئة RandomAccessFile كمصدر للدفق، أو كوجهة للدفق، وبعبارة أخرى، عند التحضير لقراءة وكتابة ملف، قم بإنشاء دفق عشوائي يشير إلى ملف الملف، بحيث يمكنك قراءة البيانات من الملف من هذا الدفق، ويمكنك أيضًا كتابة البيانات إلى الملف من خلال هذا الدفق.
فيما يلي المنشئان لفئة RandomAccessFile:
يتم استخدام معلمة الاسم لتحديد اسم الملف، مع إعطاء مصدر الدفق الذي تم إنشاؤه، والذي يعد أيضًا وجهة الدفق. وضع المعلمة هو r (للقراءة فقط) أو rw (للقراءة والكتابة)، والذي يحدد حقوق الوصول للتدفق الذي تم إنشاؤه إلى الملف.
ملف المعلمة هو كائن ملف يوفر مصدر الدفق الذي تم إنشاؤه وهو أيضًا وجهة الدفق. وضع المعلمة هو r (للقراءة فقط) أو rw (للقراءة والكتابة)، والذي يحدد حقوق الوصول للتدفق الذي تم إنشاؤه إلى الملف.
ملاحظة : عندما يشير دفق RandomAccessFile إلى ملف، لا يتم تحديث الملف.
توجد طريقة بحث (طويلة أ) في فئة RandomAccessFile تُستخدم لتحديد موضع القراءة والكتابة لتدفق RandomAccessFile. تحدد المعلمة عدد البايتات من موضع القراءة والكتابة إلى بداية الملف. بالإضافة إلى ذلك، يمكن للدفق أيضًا استدعاء طريقة getFilePointer() للحصول على موضع القراءة والكتابة الحالي للدفق. يعد دفق RandomAccessFile أكثر مرونة في قراءة الملفات وكتابتها من القراءة والكتابة المتسلسلة.
على سبيل المثال، اكتب عدة أعداد صحيحة int في ملف يسمى tom.dat، ثم قم بقراءة البيانات بترتيب عكسي:
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFileinAndOut=null;intdata[]={1,2,3,4,5,6,7,8,9,10};try{inAndOut=newRandomAccessFile (tom.dat,rw);for(inti=0;i<data.length;i++){inAndOut.writeInt(data[i]);}for(longi=data. length-1;i>=0;i --){inAndOut.seek(i*4);System.out.printf(t%d,inAndOut.readInt());/*تشغل بيانات النوع int 4 بايت، ويبدأ inAndOut من اليوم السادس والثلاثين من قراءة الملف البايتات الصحيحة الأخيرة، وقراءة عدد صحيح كل 4 بايتات للأمام*/inAndOut. Close();}catch(IOExceptione){}}}
الطرق الشائعة لدفق RandomAccessFile هي كما يلي:
ملاحظة : عندما يقرأ الأسلوب readLine() الخاص بمجرى RandomAccessFile الملفات التي تحتوي على أحرف غير ASCⅡ، مثل الملفات التي تحتوي على أحرف صينية، ستظهر "أحرف مشوشة". لذلك، من الضروري إعادة ترميز السلسلة المقروءة بواسطة readLine() باستخدام ترميز "iso-8859-1" وتخزينها في مصفوفة بايت، ثم استخدام الترميز الافتراضي للجهاز الحالي لتحويل المصفوفة إلى سلسلة العملية هي كما يلي:
Stringstr=in.readLine();
byteb[]=str.getBytes(iso-8859-1);
Stringcontent=newString(b);
إذا كان الترميز الافتراضي للجهاز هو "GB2312"، إذن
Stringcontent=newString(b);
يعادل
Stringcontent=newString(b,GB2312);
على سبيل المثال:
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFilein=null;try{in=newRandomAccessFile(Main.java,rw);longlength=in. length();// احصل على طول الملف longposition= 0; in.seek(position);// حدد موضع القراءة في بداية الملف while(position<length){Stringstr=in.readLine();byteb[]=str.getBytes(iso-8859-1) ;str =newString(b);position=in.getFilePointer();System.out.println(str);}}catch(IOExceptione){}}}