Dari penelitian sebelumnya, kita tahu bahwa jika Anda akan membaca sebuah file, Anda perlu membuat aliran input yang menunjuk ke file tersebut; jika Anda akan menulis sebuah file, Anda perlu membuat aliran output yang menunjuk ke file tersebut; Jadi, bisakah Anda membuat aliran yang dapat digunakan untuk membaca dan menulis file? Inilah tepatnya bagian tentang aliran acak.
Aliran yang dibuat oleh kelas RandomAccessFile disebut aliran acak . Berbeda dengan aliran masukan dan keluaran sebelumnya, kelas RandomAccessFile bukanlah subkelas dari kelas InputStream atau subkelas dari kelas OutputStream. Namun, titik aliran yang dibuat oleh kelas RandomAccessFile dapat digunakan sebagai sumber aliran, atau sebagai tujuan aliran. Dengan kata lain, saat bersiap untuk membaca dan menulis file, buatlah aliran acak yang menunjuk ke file, sehingga Anda dapat membaca data dari file dari aliran ini, dan Anda juga dapat menulis data ke file melalui aliran ini.
Berikut ini adalah dua konstruktor kelas RandomAccessFile:
Parameter nama digunakan untuk menentukan nama file, memberikan sumber aliran yang dibuat, yang juga merupakan tujuan aliran. Mode parameternya adalah r (read-only) atau rw (read-write), yang menentukan hak akses aliran yang dibuat ke file.
File parameter adalah objek File yang memberikan sumber aliran yang dibuat dan juga tujuan aliran. Mode parameternya adalah r (read-only) atau rw (read-write), yang menentukan hak akses aliran yang dibuat ke file.
Catatan : Ketika aliran RandomAccessFile menunjuk ke suatu file, file tersebut tidak di-refresh.
Ada metode seek(long a) di kelas RandomAccessFile yang digunakan untuk menemukan posisi baca dan tulis aliran RandomAccessFile. Parameter a menentukan jumlah byte dari posisi baca dan tulis hingga awal file. Selain itu, aliran juga dapat memanggil metode getFilePointer() untuk mendapatkan posisi baca dan tulis aliran saat ini. Aliran RandomAccessFile lebih fleksibel untuk membaca dan menulis file dibandingkan membaca dan menulis berurutan.
Misalnya, tulis beberapa bilangan bulat int ke dalam file bernama tom.dat, lalu baca datanya dalam urutan terbalik:
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFileinAndOut=null;intdata[]={1,2,3,4,5,6,7,8,9,10};coba{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());/*Data bertipe int menempati 4 byte, inAndOut dimulai dari tanggal 36 file Baca byte bilangan bulat terakhir, dan membaca bilangan bulat setiap 4 byte ke depan*/}inAndOut.close();}catch(IOExceptione){}}}
Metode umum aliran RandomAccessFile adalah sebagai berikut:
Catatan : Ketika metode readLine() aliran RandomAccessFile membaca file yang berisi karakter non-ASCⅡ, seperti file yang berisi karakter Cina, "karakter kacau" akan muncul. Oleh karena itu, string yang dibaca oleh readLine() perlu dikodekan ulang menggunakan pengkodean "iso-8859-1" dan menyimpannya dalam array byte, dan kemudian menggunakan pengkodean default mesin saat ini untuk mengubah array menjadi string .Operasinya adalah sebagai berikut:
Stringstr=di.readLine();
byteb[]=str.getBytes(iso-8859-1);
Stringcontent=String baru(b);
Jika pengkodean default mesin adalah "GB2312", maka
Stringcontent=String baru(b);
Setara dengan
Stringcontent=String baru(b,GB2312);
Misalnya:
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFilein=null;try{in=newRandomAccessFile(Main.java,rw);longlength=in.length();//Dapatkan panjang file longposition= 0; in.seek(position);//Cari posisi membaca ke awal file while(position<length){Stringstr=in.readLine();byteb[]=str.getBytes(iso-8859-1) ;str =newString(b);position=in.getFilePointer();System.out.println(str);}}catch(IOExceptione){}}}