RandomAccessFile
يتم استخدام RandomAccessFile للوصول إلى الملفات التي تحفظ سجلات البيانات. يمكنك استخدام طريقة Seek () للوصول إلى السجلات والقراءة والكتابة. لا يجب أن يكون حجم هذه السجلات هو نفسه ؛ ومع ذلك ، يجب أن يكون حجمها وموقفها معروفة. ومع ذلك ، يقتصر هذا الفئة على ملفات التشغيل.
RandomAccessFile لا ينتمي إلى فئات InputStream و OutputStream. في الواقع ، بالإضافة إلى تنفيذ واجهات Datainput و DataOutput (DatainputStream و DataOutputStream أيضًا ، لا علاقة له بهذه الفئتين ، ولا يستخدم حتى أي وظائف موجودة بالفعل في فئات InputStream و Outdustream ؛ إنها فئة مستقلة تمامًا ، وجميع الأساليب (في الغالب تنتمي إلى نفسها فقط) مكتوبة من نقطة الصفر. قد يكون هذا لأن RandomAccessFile يمكن أن يتحرك ذهابًا وإيابًا في الملف ، وبالتالي فإن سلوكه يختلف اختلافًا أساسيًا إلى حد ما عن فئات الإدخال/الإخراج الأخرى. باختصار ، إنها فئة منفصلة ترث كائن مباشرة.
في الأساس ، تتمثل طريقة عمل RandomAccessFile في الجمع بين DatainputStream و DataOutputStream ، وإضافة بعض أساليبها الخاصة ، مثل getFilePointer () من أجل تحديد المواقع ، والبحث () للانتقال في الملف ، وتحديد الطول () لحجم الملف ، و Skipbytes () للتخطي عن طريق عدد البوار. بالإضافة إلى ذلك ، يحتوي مُنشئه أيضًا على معلمة تشير إلى ما إذا كان سيتم فتح الملف في وضع القراءة فقط ("R") أو وضع القراءة والكتابة ("RW") (تمامًا مثل FOPEN () C). لا يدعم كتابة الملفات فقط.
فقط RandomAccessFile لديه طريقة بحث Seek ، وهذه الطريقة قابلة للتطبيق فقط على الملفات. يحتوي BufferEdInputStream على طريقة Mark () ، والتي يمكنك استخدامها لتعيين العلامة (حفظ النتيجة في متغير داخلي) ، ثم استدعاء إعادة تعيين () للعودة إلى هذا الموقف ، ولكن وظيفتها ضعيفة للغاية وليست عملية للغاية.
تم استبدال معظم وظائف RandomAccessFile ، ولكن ليس كلها ، بـ "الملفات المخصصة للذاكرة" لـ JDK 1.4. يجب أن تفكر في استخدام "الملفات المعينة للذاكرة" بدلاً من RandomAccessFile.
استيراد java.io.ioException ؛ استيراد java.io.randomaccessfile ؛ الطبقة العامة testRandomAccessFile {public static void main (string [] args) يلقي ioException {randomaccessfile rf = new RandomAccessFile ("rtest.dat" ، "rw") ؛ لـ (int i = 0 ؛ i <10 ؛ i ++) {// اكتب النوع الأساسي double data rf.writedouble (i * 1.414) ؛ } rf.close () ؛ rf = new RandomAccessFile ("rtest.dat" ، "rw") ؛ // انقل مباشرة حرك مؤشر الملف إلى 5th Double Data Rf.seek (5 * 8) ؛ // الكتابة فوق البيانات المزدوجة السادسة rf.writedouble (47.0001) ؛ rf.close () ؛ rf = new RandomAccessFile ("rtest.dat" ، "r") ؛ لـ (int i = 0 ؛ i <10 ؛ i ++) {system.out.println ("value" + i + ":" + rf.readdouble ()) ؛ } rf.close () ؛ }}ملف تعيين الذاكرة
تتيح لك الملفات المعينة للذاكرة إنشاء وتعديل الملفات الكبيرة جدًا التي لا يمكن وضعها في الذاكرة. مع الملف المعين للذاكرة ، يمكنك التفكير في أن الملف قد تمت قراءة الذاكرة والوصول إليه كصفيف كبير جدًا. يمكن لهذا الحل أن يبسط بشكل كبير رمز الملفات تعديل.
FILECHANNEL.MAP (وضع FILECHANNEL.MAPMODE ، الموضع الطويل ، الحجم الطويل) يقوم بتعيين مساحة الملف لهذه القناة مباشرة في الذاكرة. لاحظ أنه يجب أن تشير إلى من أين يخلع نطاق الخريطة ومدى حجمها ؛ وهذا هو ، يمكنه أيضًا تعيين جزء صغير من ملف كبير.
MedByTeBuffer هي فئة فرعية من Bytebuffer ، لذلك تحتوي على جميع طرق Bytebuffer ، ولكن تتم إضافة قوة جديدة () لإجبار تحديث محتوى المخزن المؤقت إلى جهاز التخزين ، وتحميل () تحميل البيانات في جهاز التخزين في الذاكرة ، و isloaded () في موقع الذاكرة ما إذا كانت البيانات الموجودة في الذاكرة تم مزامنتها مع إعدادات التقييم. هنا نوضح باختصار فقط أساليب put () والحصول على (). بالإضافة إلى ذلك ، يمكنك أيضًا استخدام طرق مثل Ascharbuffer () للحصول على العرض المخزن المؤقت لبيانات النوع الأساسية المقابلة ، والتي يمكن بسهولة قراءة وكتابة بيانات النوع الأساسي.
استيراد java.io.randomaccessfile ؛ استيراد java.nio.mappedbytebuffer ؛ استيراد java.nio.channels.filechannel ؛ الفئة العامة argemedfiles {static int length = 0x8000000 ؛ // 128 ميغابايت من الفراغ الثابت العام (سلسلة [] args) يلقي الاستثناء {// لفتح الملف بطريقة قابلة للقراءة وقابلة للكتابة ، يتم استخدام RandomAccessFile هنا لإنشاء الملف. filechannel fc = new RandomAccessFile ("test.dat" ، "rw"). getChannel () ؛ // لاحظ أن قناة الملف القابلة للقراءة والقابلة للكتابة يجب أن تستند إلى دفق الملف القابل للقراءة والقابل للكتابة نفسه. medbytebuffer out = fc.map (filechannel.mapmode.read_write ، 0 ، طول) ؛ // اكتب محتوى 128m لـ (int i = 0 ؛ i <length ؛ i ++) {out.put ((byte) 'x') ؛ } System.out.println ("HIST WRITE") ؛ // اقرأ 6 بايت من منتصف الملف لـ (int i = length / 2 ؛ i <length / 2+6 ؛ i ++) {system.out.print ((char) out.get (i)) ؛ } fc.close () ؛ }}على الرغم من أنه يبدو أن FileOtputStream يستخدم لكتابة الخرائط ، يجب أن تستخدم جميع المخرجات في ملف التعيين RandomAccessFile ، ولكن إذا كنت بحاجة فقط إلى قراءة FileInputStream ، فيجب عليك استخدام ملف الوصول العشوائي عند كتابة ملفات تعيين. ربما سبب القراءة عند الكتابة.
يقوم البرنامج بإنشاء ملف 128 ميغابايت. إذا قرأت الذاكرة في وقت واحد ، فقد يتسبب ذلك في تجاوز الذاكرة ، ولكن يبدو أن الوصول هنا مجرد لحظة ، لأنه يتم نقل جزء صغير منها فقط إلى الذاكرة ، ويتم وضع الباقي على ملف المبادلة. وبهذه الطريقة ، يمكنك بسهولة تعديل ملفات Super-Large (تصل إلى 2 جيجابايت). لاحظ أن Java تستدعي "آلية تعيين الملفات" لنظام التشغيل لتحسين الأداء.
تطبيق فئة RandomAccessFile:
/ * * وظيفة البرنامج: إظهار عمليات فئة RandomAccessFile وتنفيذ عملية نسخة ملف. */ package com.lwj.demo ؛ استيراد java.io.*؛ الطبقة العامة randomaccessfiledemo {public static void main (string [] args) يلقي الاستثناء {randomaccessfile file = new RandomAccessFile ("file" ، "rw") ؛ . file.writeBoolean (true) ؛ // يحتل 1 byte file.writeshort (395) ؛ // يحتل 2 bytes file.writelong (2325451L) ؛ // يحتل 8 بايت file.writeutf ("سلسلة أخرى UTF") ؛ file.writefloat (35.5f) ؛ // يحتل 4 بايت file.writechar ('a') ؛ // يشغل 2 بايت file.eek (0) ؛ // اضبط موضع مؤشر الملف على بداية الملف // فيما يلي قراءة البيانات من ملف الملف. انتبه إلى موقع نظام مؤشر الملفات. مؤشر ببايت ، وفي هذه الحالة يتم تخطي القيمة المنطقية. system.out.println (file.readfloat ()) ؛ العدد) بايت = بايت جديد [len] ؛ إدراج RandomAccessFile اكتب مثالًا:
/ **** @param تخطي عدد البايتات التي يجب تخطيها لإدراج بيانات* param str لإدراج* param مسار ملف FileName*/ public static void beiju (تخطي طويل ، سلسلة str ، اسم ملف السلسلة) {try {randomaccessfile raf = new randomaccessfile (filename ، "rw") ؛ if (skip <0 || skip> raf.length ()) {system.out.println ("Skip number of skiked bytes غير صالح") ؛ يعود؛ } byte [] b = str.getBytes () ؛ raf.setLength (raf.length () + B.Length) ؛ لـ (long i = raf.length () - 1 ؛ i> بايت temp = raf.readbyte () ؛ raf.seek (i) ؛ raf.writeByte (temp) ؛ } raf.seek (تخطي) ؛ raf.write (ب) ؛ raf.close () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}استخدم RandomAccessFile لتحقيق التنزيل متعدد الخيوط للملفات ، أي عند تنزيل مؤشرات ترابط متعددة ملفًا ، يتم تقسيم الملف إلى عدة قطع ، ويتم تنزيل كل قطعة مع مؤشر ترابط مختلف. فيما يلي مثال على استخدام MultiThreading عند كتابة الملفات ، حيث يتم تخصيص المساحة المطلوبة للملف مسبقًا ، ثم تم تصنيفها في المساحة المخصصة ، ثم مكتوبة:
استيراد java.io.filenotfoundException ؛ استيراد java.io.ioException ؛ استيراد java.io.randomaccessfile ؛ /*** الاختبار باستخدام MultiTreading لعمليات كتابة الملفات*/اختبار الفئة العامة {Public Static Void Main (String [] args) يرمي استثناء {// مسبق من القرص المسبق ، سيتم إنشاء ملف بحجم محدد على Disk RandomAccessFile Raf = new Randomaccessfile ("d: //abc.txt" ، "RW") ؛ Raf.SetLength (1024*1024) ؛ // مسبق من مسافة 1M File Space raf.close () ؛ // محتوى الملف ليكون سلسلة مكتوبة S1 = "First String" ؛ السلسلة S2 = "السلسلة الثانية" ؛ السلسلة S3 = "السلسلة الثالثة" ؛ سلسلة S4 = "السلسلة الرابعة" ؛ سلسلة S5 = "السلسلة الخامسة" ؛ // اكتب ملفًا في نفس الوقت باستخدام مؤشرات ترابط متعددة FILEWRITETHREAD (1024*1 ، s1.getbytes ()). start () ؛ // اكتب بيانات من 1024 بايت من الملف الجديد filewritethread (1024*2 ، s2.getBytes ()). start () ؛ // اكتب بيانات من 2048 بايت من الملف الجديد filewritethread (1024*3 ، s3.getbytes ()). start () ؛ // اكتب بيانات من 3072 بايت من الملف الجديد fileWritethRead (1024*4 ، s4.getBytes ()). start () ؛ // اكتب بيانات من 4096 بايت من الملف الجديد filewritethread (1024*5 ، s5.getbytes ()). start () ؛ // اكتب بيانات من 5120 بايت من الملف} // استخدم مؤشر ترابط لكتابة بيانات محددة في الموقع المحدد للفئة الثابتة filewretethread يمتد مؤشر الترابط {private int skip ؛ محتوى بايت خاص [] ؛ FilewRiteThread (int skip ، byte [] content) {this.skip = skip ؛ this.content = المحتوى ؛ } public void run () {randomaccessfile raf = null ؛ حاول {raf = new RandomAccessFile ("d: //abc.txt" ، "rw") ؛ raf.seek (تخطي) ؛ raf.write (المحتوى) ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (ioException e) {// todo acto catch block e.printstacktrace () ؛ } أخيرًا {try {raf.close () ؛ } catch (استثناء e) {}}}}}}}}التفسير التفصيلي لاستخدام Java RandomAccessFile أعلاه هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.