จากการศึกษาครั้งก่อน เรารู้ว่าหากคุณจะอ่านไฟล์ คุณต้องสร้างอินพุตสตรีมที่ชี้ไปที่ไฟล์นั้น หากคุณกำลังจะเขียนไฟล์ คุณจะต้องสร้างเอาต์พุตสตรีมที่ชี้ไปที่ไฟล์นั้น คุณสามารถสร้างสตรีมที่คุณสามารถอ่านและเขียนไฟล์ได้หรือไม่? นี่คือสิ่งที่ส่วนนี้เกี่ยวกับสตรีมแบบสุ่ม
สตรีมที่สร้างโดย คลาส RandomAccessFile เรียกว่า สตรีมแบบสุ่ม ต่างจากสตรีมอินพุตและเอาต์พุตก่อนหน้า คลาส RandomAccessFile ไม่ใช่ทั้งคลาสย่อยของคลาส InputStream หรือคลาสย่อยของคลาส OutputStream อย่างไรก็ตาม จุดของสตรีมที่สร้างโดยคลาส RandomAccessFile สามารถใช้เป็นแหล่งที่มาของสตรีมหรือเป็นปลายทางของสตรีมได้ กล่าวอีกนัยหนึ่ง เมื่อเตรียมการอ่านและเขียนไฟล์ ให้สร้างสตรีมแบบสุ่มที่ชี้ไปที่ ไฟล์ ดังนั้นคุณจึงสามารถอ่านข้อมูลจากไฟล์จากสตรีมนี้ และคุณยังสามารถเขียนข้อมูลไปยังไฟล์ผ่านสตรีมนี้ได้อีกด้วย
ต่อไปนี้เป็นตัวสร้างสองตัวของคลาส RandomAccessFile:
พารามิเตอร์ชื่อใช้เพื่อกำหนดชื่อไฟล์ โดยระบุแหล่งที่มาของสตรีมที่สร้างขึ้น ซึ่งเป็นปลายทางของสตรีมด้วย โหมดพารามิเตอร์คือ r (อ่านอย่างเดียว) หรือ rw (อ่าน-เขียน) ซึ่งกำหนดสิทธิ์การเข้าถึงของสตรีมที่สร้างขึ้นไปยังไฟล์
ไฟล์พารามิเตอร์คืออ็อบเจ็กต์ไฟล์ที่ให้แหล่งที่มาของสตรีมที่สร้างขึ้นและยังเป็นปลายทางของสตรีมด้วย โหมดพารามิเตอร์คือ r (อ่านอย่างเดียว) หรือ rw (อ่าน-เขียน) ซึ่งกำหนดสิทธิ์การเข้าถึงของสตรีมที่สร้างขึ้นไปยังไฟล์
หมายเหตุ : เมื่อสตรีม RandomAccessFile ชี้ไปที่ไฟล์ ไฟล์จะไม่รีเฟรช
มีเมธอด search(long a) ในคลาส RandomAccessFile ที่ใช้เพื่อค้นหาตำแหน่งการอ่านและเขียนของสตรีม RandomAccessFile พารามิเตอร์ a กำหนดจำนวนไบต์จากตำแหน่งการอ่านและเขียนจนถึงจุดเริ่มต้นของไฟล์ นอกจากนี้ สตรีมยังสามารถเรียกใช้เมธอด getFilePointer() เพื่อรับตำแหน่งการอ่านและเขียนปัจจุบันของสตรีม สตรีม RandomAccessFile มีความยืดหยุ่นในการอ่านและเขียนไฟล์มากกว่าการอ่านและเขียนตามลำดับ
ตัวอย่างเช่น เขียนจำนวนเต็ม int หลายค่าลงในไฟล์ชื่อ tom.dat จากนั้นอ่านข้อมูลในลำดับย้อนกลับ:
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFileinAndOut=null;intdata[]={1,2,3,4,5,6,7,8,9,10};ลอง{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 เริ่มจากตำแหน่งที่ 36 ของไฟล์ Read ไบต์จำนวนเต็มสุดท้าย และอ่านจำนวนเต็มทุกๆ 4 ไบต์ไปข้างหน้า*/}inAndOut.close();}catch(IOExceptione){}}}
วิธีการทั่วไปของสตรีม RandomAccessFile มีดังนี้:
หมายเหตุ : เมื่อเมธอด readLine() ของสตรีม RandomAccessFile อ่านไฟล์ที่มีอักขระที่ไม่ใช่ ASCⅡ เช่น ไฟล์ที่มีอักขระจีน "อักขระที่อ่านไม่ออก" จะปรากฏขึ้น ดังนั้นจึงจำเป็นต้องเข้ารหัสสตริงที่อ่านโดย readLine() อีกครั้งโดยใช้การเข้ารหัส "iso-8859-1" และเก็บไว้ในอาร์เรย์ไบต์ จากนั้นใช้การเข้ารหัสเริ่มต้นของเครื่องปัจจุบันเพื่อแปลงอาร์เรย์เป็นสตริง . การดำเนินการมีดังนี้:
Stringstr=in.readLine();
ไบต์ []=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);//ค้นหาตำแหน่งการอ่านจนถึงจุดเริ่มต้นของไฟล์ในขณะที่(position<length){Stringstr=in.readLine();byteb[]=str.getBytes(iso-8859-1) ;str =newString(b);position=in.getFilePointer();System.out.println(str);}}catch(IOExceptione){}}}