توفر Java فئة RandomAccessFile للسماح بقراءة البيانات وكتابتها في أي موقع في الملف. جميع التدفقات التي استخدمتها حتى الآن تُعرف باسم تدفقات للقراءة فقط أو للكتابة فقط. تسمى هذه التدفقات التدفقات المتسلسلة. يُطلق على الملف الذي يتم فتحه باستخدام دفق متسلسل اسم ملف الوصول المتسلسل. لا يمكن تحديث محتويات ملف الوصول التسلسلي. ومع ذلك، غالبًا ما يكون من الضروري تعديل الملفات. توفر Java فئة RandomAccessFile للسماح بقراءة البيانات وكتابتها في أي موقع في الملف. يُعرف الملف الذي يتم فتحه باستخدام فئة RandomAccessFile باسم ملف الوصول العشوائي .
تطبق فئة RandomAccessFile الواجهات DataInput وDataOutput، كما هو موضح في الشكل أدناه. تحدد واجهة DataInput طرق قراءة القيم والسلاسل من النوع البدائي (على سبيل المثال، readInt، readDouble، readChar، readBoolean، readUTF) وواجهة DataOutput تحدد طرق كتابة القيم والسلاسل من النوع البدائي (على سبيل المثال، writeInt، writeDouble، writeChar، writeBoolean، writeUTF).
عند إنشاء RandomAccessFile، يمكنك تحديد أحد الوضعين: r أو rw. الوضع r يعني أن الدفق للقراءة فقط، والوضع rw يشير إلى أن الدفق يسمح بالقراءة والكتابة. على سبيل المثال، تقوم العبارة التالية بإنشاء دفق جديد، raf، الذي يسمح للبرنامج بالقراءة من الملف والكتابة إليه test.dat:
RandomAccessFile raf = new RandomAccessFile("test.dat", "rw");
إذا كان test.dat موجودًا بالفعل، فسيتم إنشاء raf للوصول إليه؛ إذا لم يكن test.dat موجودًا، فسيتم إنشاء ملف جديد يسمى test.dat، ويتم إنشاء raf للوصول إلى الملف الجديد. تقوم الطريقة raf.length() بإرجاع عدد البايتات في test.dat في أي وقت محدد. إذا قمت بإلحاق بيانات جديدة بالملف، فإن raf. length() يزداد.
إذا لم يكن الملف مخصصًا للتعديل، فافتحه باستخدام الوضع r. وهذا يمنع التعديل غير المقصود للملف.
يتكون ملف الوصول العشوائي من سلسلة من البايتات. يتم وضع علامة خاصة تسمى مؤشر الملف على إحدى هذه البايتات. تتم عملية القراءة أو الكتابة في موقع مؤشر الملف. عند فتح ملف، يتم تعيين مؤشر الملف في بداية الملف. عند قراءة البيانات أو كتابتها في الملف، يتحرك مؤشر الملف للأمام إلى عنصر البيانات التالي. على سبيل المثال، إذا قرأت قيمة int باستخدام readInt()، فسيقرأ JVM 4 بايت من مؤشر الملف، والآن أصبح مؤشر الملف هو 4 بايت قبل الموقع السابق، كما هو موضح في الشكل أدناه.
بالنسبة إلى RandomAccessFile raf، يمكنك استخدام طريقة raf.seek(position) لتحريك مؤشر الملف إلى موضع محدد. raf.seek(0) ينقله إلى بداية الملف، و raf.seek(raf. length()) ينقله إلى نهاية الملف. يوضح الكود أدناه RandomAccessFile.
package demo; import java.io.*; public class TestRandomAccessFile { public static void main(String[] args) throws IOException { try( // Create a random access file RandomAccessFile inout = new RandomAccessFile("inout.dat", "rw"); ) { // Clear the file to destroy the old contents if exists inout.setLength(0); // Write new integers to the file for(int i = 0; iطول الملف الحالي هو 800
الرقم الأول هو 0
الرقم الثاني هو 1
الرقم العاشر هو 9
الطول الجديد هو 804
الرقم الحادي عشر هو 555يتم إنشاء RandomAccessFile للملف المسمى inout.dat مع الوضع rw للسماح بعمليات القراءة والكتابة في السطر 8.
inout.setLength(0) يضبط الطول على 0 في السطر 11. وهذا، في الواقع، يؤدي إلى تدمير المحتويات القديمة للملف.
حلقة for تكتب قيم 200 int من 0 إلى 199 في الملف في السطرين 14 و15. منذ كل [ تأخذ قيمة &&&]int 4 بايت، ويبلغ الطول الإجمالي للملف الذي تم إرجاعه من inout.length() الآن 800 (السطر 18)، كما هو موضح في نموذج الإخراج.
استدعاءinout.seek(0) في السطر 21 يعين مؤشر الملف إلى بداية الملف. inout.readInt() يقرأ القيمة الأولى في السطر 22 وينقل مؤشر الملف إلى الرقم التالي. تتم قراءة الرقم الثاني في السطر 26.
inout.seek(9 * 4) (السطر 29) ينقل مؤشر الملف إلى الرقم العاشر. inout.readInt() يقرأ الرقم العاشر وينقل مؤشر الملف إلى الرقم الحادي عشر في السطر 30. inout.write(555) يكتب الرقم الحادي عشر الجديد في الموضع الحالي ( السطر 33). تم تدمير الرقم الحادي عشر السابق.
inout.seek(inout.length()) يحرك مؤشر الملف إلى نهاية الملف (السطر 36). inout.writeInt(999) يكتب 999 إلى الملف (السطر 37). الآن يتم زيادة طول الملف بمقدار 4، لذلك يقوم inout.length() بإرجاع 804 (السطر 40).
inout.seek(10 * 4) ينقل مؤشر الملف إلى الرقم الحادي عشر في السطر 43. يتم عرض الرقم الحادي عشر الجديد، 555، في السطر 44.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3