แบบสุ่ม
RandomaccessFile ใช้เพื่อเข้าถึงไฟล์ที่บันทึกข้อมูลข้อมูล คุณสามารถใช้วิธีการค้นหา () เพื่อเข้าถึงระเบียนและอ่านและเขียน ขนาดของบันทึกเหล่านี้ไม่จำเป็นต้องเหมือนกัน อย่างไรก็ตามขนาดและตำแหน่งของพวกเขาจะต้องเป็นที่รู้จัก อย่างไรก็ตามคลาสนี้ จำกัด เฉพาะไฟล์ที่ใช้งานได้
RandomaccessFile ไม่ได้อยู่ในคลาส InputStream และ OutputStream ในความเป็นจริงนอกเหนือจากการใช้อินเทอร์เฟซ Datainput และ DataOutput (DatainputStream และ DataOutputStream ยังใช้อินเทอร์เฟซทั้งสองนี้) มันไม่มีอะไรเกี่ยวข้องกับคลาสทั้งสองนี้และไม่ได้ใช้ฟังก์ชั่นใด ๆ ที่มีอยู่แล้วในคลาสอินพุตและเอาท์พุทสตรีม มันเป็นคลาสที่เป็นอิสระอย่างสมบูรณ์และวิธีการทั้งหมด (ส่วนใหญ่เป็นของตัวเองเท่านั้น) เขียนตั้งแต่เริ่มต้น อาจเป็นเพราะ RandomAccessFile สามารถย้ายไปมาในไฟล์ได้ดังนั้นพฤติกรรมของมันจึงค่อนข้างแตกต่างจากคลาส I/O อื่น ๆ ในระยะสั้นมันเป็นคลาสแยกต่างหากที่สืบทอดวัตถุโดยตรง
โดยพื้นฐานแล้ววิธีการทำงานของ RandomAccessFile คือการรวม datainputStream และ dataOutputStream และเพิ่มวิธีการบางอย่างของตัวเองเช่น getFilePointer () สำหรับการวางตำแหน่งค้นหา () สำหรับการเคลื่อนย้ายในไฟล์และกำหนดความยาว () สำหรับขนาดไฟล์และ skipbytes () นอกจากนี้ตัวสร้างยังมีพารามิเตอร์ที่ระบุว่าจะเปิดไฟล์ในโหมดอ่านอย่างเดียว ("R") หรือโหมดอ่าน-เขียน ("RW") (เหมือนกับ fopen () ของ C) ไม่สนับสนุนการเขียนไฟล์เท่านั้น
เฉพาะ RandomAccessFile เท่านั้นที่มีวิธีการค้นหาและวิธีนี้ใช้ได้กับไฟล์เท่านั้น BufferedInputStream มีวิธีการทำเครื่องหมาย () ซึ่งคุณสามารถใช้เพื่อตั้งค่าเครื่องหมาย (บันทึกผลลัพธ์ในตัวแปรภายใน) จากนั้นเรียกรีเซ็ต () เพื่อกลับไปยังตำแหน่งนี้ แต่ฟังก์ชั่นของมันอ่อนแอเกินไปและไม่สามารถใช้งานได้จริง
ฟังก์ชั่นส่วนใหญ่ของ RandomaccessFile แต่ไม่ใช่ทั้งหมดถูกแทนที่ด้วย "ไฟล์ที่ทำโดยหน่วยความจำ" ของ JDK 1.4 คุณควรพิจารณาว่าจะใช้ "ไฟล์ที่ทำโดยหน่วยความจำ" แทนที่จะเป็นแบบสุ่ม
นำเข้า java.io.ioException; นำเข้า java.io.randomaccessFile; Public Class TestRandomAccessFile {โมฆะสาธารณะคงที่หลัก (สตริง [] args) พ่น IOException {RandomAccessFile RF = new RandomActCessFile ("rtest.dat", "rw"); สำหรับ (int i = 0; i <10; i ++) {// เขียนประเภทข้อมูลพื้นฐานสองข้อมูล rf.writedouble (i * 1.414); } rf.close (); rf = new randomaccessFile ("rtest.dat", "rw"); // หมุนตัวชี้ไฟล์โดยตรงไปยัง Data Data Data RF.Seek (5 * 8); // เขียนทับข้อมูลสองครั้งที่ 6 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, ตำแหน่งยาว, ขนาดยาว) แมปพื้นที่ไฟล์ของช่องนี้ลงในหน่วยความจำโดยตรง โปรดทราบว่าคุณต้องระบุว่าแผนที่จากที่ใดและช่วงของแผนที่มีขนาดใหญ่แค่ไหน นั่นคือมันยังสามารถแมปส่วนเล็ก ๆ ของไฟล์ขนาดใหญ่
MappedByTebuffer เป็นคลาสย่อยของ Bytebuffer ดังนั้นจึงมีวิธีการทั้งหมดของ Bytebuffer แต่มีการเพิ่มแรงใหม่ () เพื่อบังคับให้รีเฟรชเนื้อหาของบัฟเฟอร์ไปยังอุปกรณ์จัดเก็บข้อมูลโหลด () โหลดข้อมูลในอุปกรณ์จัดเก็บข้อมูลลงในหน่วยความจำ ที่นี่เราแสดงวิธีการสั้น ๆ () และรับ () สั้น ๆ นอกจากนี้คุณยังสามารถใช้วิธีการเช่น ascharbuffer () เพื่อรับมุมมองบัฟเฟอร์ของข้อมูลประเภทพื้นฐานที่สอดคล้องกันซึ่งสามารถอ่านและเขียนข้อมูลประเภทพื้นฐานได้อย่างง่ายดาย
นำเข้า java.io.randomaccessFile; นำเข้า java.nio.mappedbytebuffer; นำเข้า java.nio.channels.filechannel; คลาสสาธารณะ LargemappedFiles {ความยาว int คงที่ = 0x8000000; // 128 MB โมฆะสาธารณะคงที่หลัก (String [] args) โยนข้อยกเว้น {// เพื่อที่จะเปิดไฟล์ในวิธีที่อ่านได้และเขียนได้จะใช้แบบสุ่ม AppleAccessFile ที่นี่เพื่อสร้างไฟล์ FileChannel FC = new RandomAccessFile ("test.dat", "rw"). getChannel (); // โปรดทราบว่าช่องไฟล์ที่อ่านได้และเขียนได้จะต้องขึ้นอยู่กับสตรีมไฟล์ที่อ่านได้และเขียนได้เอง MappedByTebuffer out = fc.map (filechannel.mapmode.read_write, 0, ความยาว); // เขียนเนื้อหา 128m สำหรับ (int i = 0; i <length; i ++) {out.put ((ไบต์) 'x'); } system.out.println ("เสร็จสิ้นการเขียน"); // อ่าน 6 ไบต์ตรงกลางของไฟล์สำหรับ (int i = length / 2; i <length / 2+6; i ++) {system.out.print ((char) out.get (i)); } fc.close (); -แม้ว่าดูเหมือนว่า FileOutputStream จะใช้ในการเขียนการแมป แต่เอาต์พุตทั้งหมดในไฟล์การแม็พจะต้องใช้ RandomAccessFile แต่ถ้าคุณต้องการอ่าน FileInputStream เท่านั้นคุณต้องใช้ไฟล์การเข้าถึงแบบสุ่มเมื่อเขียนไฟล์การแมป อาจเป็นเหตุผลในการอ่านเมื่อเขียน
โปรแกรมสร้างไฟล์ 128MB หากคุณอ่านหน่วยความจำในครั้งเดียวมันอาจทำให้หน่วยความจำล้น แต่การเข้าถึงที่นี่ดูเหมือนจะเป็นเพียงช่วงเวลาหนึ่งเพราะมีเพียงส่วนเล็ก ๆ ของมันเท่านั้นที่ถูกถ่ายโอนไปยังหน่วยความจำและส่วนที่เหลือจะถูกวางไว้ในไฟล์ swap วิธีนี้คุณสามารถแก้ไขไฟล์ที่ใหญ่มาก (สูงสุด 2 GB) โปรดทราบว่า Java เรียกว่า "กลไกการแมปไฟล์" ของระบบปฏิบัติการเพื่อปรับปรุงประสิทธิภาพ
แอปพลิเคชันของคลาส AppleraccessFile:
/ * * ฟังก์ชั่นโปรแกรม: แสดงให้เห็นถึงการดำเนินการของคลาส RandomAccessFile และใช้การดำเนินการคัดลอกไฟล์ */ แพ็คเกจ com.lwj.demo; นำเข้า Java.io.*; คลาสสาธารณะ RandomAccessFiledEmo {โมฆะสาธารณะคงที่หลัก (สตริง [] args) โยนข้อยกเว้น {randomaccessFile ไฟล์ = ใหม่ RandomaccessFile ("ไฟล์", "rw"); // ข้อมูลต่อไปนี้เขียนข้อมูลไปยังไฟล์ไฟล์ WWRITEINT (20); // มันใช้งาน 4 ไบต์ไฟล์ WritedOwble (8.236598); // มันใช้งาน 8 ไบต์ File.WriteUtf ("นี่คือสตริง UTF"); // ความยาวนี้เขียนขึ้นในสองไบต์แรกของไฟล์ปัจจุบัน file.writeboolean (true); // ครอบครอง 1 byte file.writeshort (395); // ครอบครอง 2 bytes file.writeLong (2325451L); // ครอบครอง 8 bytes file.writeutf ( file.writefloat (35.5f); // ครอบครอง 4 bytes file.writechar ('a'); // ครอบครอง 2 bytes file.seek (0); // ตั้งค่าตำแหน่งตัวชี้ไฟล์เป็นจุดเริ่มต้นของไฟล์ // ต่อไปนี้คือการอ่านข้อมูลจากไฟล์ไฟล์ ให้ความสนใจกับตำแหน่งของไฟล์ตัวชี้ไฟล์. println (" - - - - - - - - - - - - - - - - - - - - - - - - - ― ― ― ― ― ― ― ― ― ― ― ― ― ― ― ไบต์และในกรณีนี้ค่าบูลีนและค่าสั้นจะถูกข้ามไป System.out.println (file.readfloat ()); // ต่อไปนี้แสดงให้เห็นถึงการดำเนินการคัดลอกไฟล์ System.out.println (" - - - - - - - - - - - - - - - - ―; ไฟล์. seek (0); แบบสุ่ม หมายเลข) BYTE [] B = BYTE ใหม่ [LEN]; การแทรกแบบสุ่ม AccessFile เขียนตัวอย่าง:
/ **** @param ข้ามจำนวนไบต์ในการข้ามเพื่อแทรกข้อมูล* @param str string เพื่อแทรก* @param ชื่อไฟล์ชื่อไฟล์*/ โมฆะสาธารณะคงที่ beiju (ยาวข้าม, สตริง str, string filename) {ลอง {randomaccessfile raf = ใหม่ if (skip <0 || skip> raf.length ()) {system.out.println ("ข้ามจำนวนไบต์ข้ามไม่ถูกต้อง"); กลับ; } byte [] b = str.getBytes (); raf.setLength (raf.length () + b.length); สำหรับ (long i = raf.length () - 1; i> b.length + skip - 1; i -) {raf.seek (i - b.length); byte temp = raf.readbyte (); raf.seek (i); raf.writeByte (อุณหภูมิ); } raf.seek (ข้าม); raf.write (b); raf.close (); } catch (exception e) {e.printstacktrace (); -ใช้ RandomAccessFile เพื่อรับรู้การดาวน์โหลดไฟล์แบบหลายเธรดนั่นคือเมื่อหลายเธรดดาวน์โหลดไฟล์ไฟล์จะถูกแบ่งออกเป็นหลายชิ้นและแต่ละชิ้นจะถูกดาวน์โหลดด้วยเธรดที่แตกต่างกัน นี่คือตัวอย่างของการใช้มัลติเธรดเมื่อเขียนไฟล์ซึ่งพื้นที่ที่จำเป็นสำหรับไฟล์จะถูกจัดสรรล่วงหน้าแล้ว chunked ในพื้นที่ที่จัดสรรแล้วเขียนแล้วเขียน:
นำเข้า java.io.filenotfoundException; นำเข้า java.io.ioException; นำเข้า java.io.randomaccessFile; /*** ทดสอบโดยใช้มัลติเธรดสำหรับการดำเนินการเขียนไฟล์*/การทดสอบคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {// พื้นที่ดิสก์ที่จัดสรรไว้ล่วงหน้าไฟล์ขนาดที่ระบุจะถูกสร้างขึ้นบนดิสก์ RandomAccessFile RAF = ใหม่ raf.setLength (1024*1024); // ที่จัดสรรไว้ล่วงหน้า 1M File Space Raf.Close (); // เนื้อหาไฟล์ที่จะเขียนสตริง s1 = "สตริงแรก"; สตริง s2 = "สตริงที่สอง"; สตริง s3 = "สตริงที่สาม"; สตริง s4 = "สตริงที่สี่"; สตริง s5 = "สตริงที่ห้า"; // เขียนไฟล์ในเวลาเดียวกันโดยใช้หลายเธรดใหม่ FileWritetHread (1024*1, S1.getBytes ()). Start (); // เขียนข้อมูลจาก 1024 ไบต์ของไฟล์ใหม่ FileWritetHread (1024*2, S2.getBytes ()). Start (); // เขียนข้อมูลจาก 2048 ไบต์ของไฟล์ใหม่ fileWritetHread (1024*3, s3.getBytes ()). เริ่มต้น (); // เขียนข้อมูลจาก 3072 ไบต์ของไฟล์ใหม่ FileWritetHread (1024*4, S4.getBytes ()). Start (); // เขียนข้อมูลจาก 4096 ไบต์ของไฟล์ใหม่ fileWritetHread (1024*5, s5.getBytes ()). start (); // เขียนข้อมูลจาก 5120 ไบต์ของไฟล์} // ใช้เธรดเพื่อเขียนข้อมูลที่ระบุที่ตำแหน่งที่ระบุของไฟล์แบบคงที่ไฟล์ FileWritetHread ขยายเธรด {Private Int Skip; ไบต์ส่วนตัว [] เนื้อหา; public filewritethread (int skip, byte [] เนื้อหา) {this.skip = skip; this.content = เนื้อหา; } โมฆะสาธารณะ Run () {RandomAccessFile Raf = null; ลอง {raf = new randomaccessFile ("d: //abc.txt", "rw"); raf.seek (ข้าม); raf.write (เนื้อหา); } catch (filenotfoundException e) {e.printStackTrace (); } catch (ioexception e) {// todo บล็อก catch block ที่สร้างอัตโนมัติ e.printstacktrace (); } ในที่สุด {ลอง {raf.close (); } catch (exception e) {}}}}}}}}คำอธิบายโดยละเอียดเกี่ยวกับการใช้งานของ Java RandomaccessFile ด้านบนเป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น