Rumah >Java >javaTutorial >Fail Akses Rawak
Java menyediakan kelas RandomAccessFile untuk membolehkan data dibaca dan ditulis ke mana-mana lokasi dalam fail. Semua strim yang anda gunakan setakat ini dikenali sebagai strim baca sahaja atau tulis sahaja. Strim ini dipanggil strim berurutan. Fail yang dibuka menggunakan aliran berjujukan dipanggil fail akses berjujukan. Kandungan fail akses berjujukan tidak boleh dikemas kini. Walau bagaimanapun, selalunya perlu untuk mengubah suai fail. Java menyediakan kelas RandomAccessFile untuk membenarkan data dibaca dan ditulis ke mana-mana lokasi dalam fail. Fail yang dibuka menggunakan kelas RandomAccessFile dikenali sebagai fail akses rawak.
Kelas RandomAccessFile melaksanakan antara muka DataInput dan DataOutput, seperti yang ditunjukkan dalam Rajah di bawah. Antara muka DataInput mentakrifkan kaedah untuk membaca nilai dan rentetan jenis primitif (cth., readInt, readDouble, readChar, readBoolean, readUTF) dan antara muka DataOutput mentakrifkan kaedah untuk menulis nilai dan rentetan jenis primitif (cth., writeInt, writeDouble 🎜>, writeChar, writeBoolean, writeUTF).
Apabila mencipta
RandomAccessFile, anda boleh menentukan salah satu daripada dua mod: r atau rw. Mod r bermaksud strim adalah baca sahaja dan mod rw menunjukkan bahawa strim membenarkan kedua-dua membaca dan menulis. Sebagai contoh, penyataan berikut mencipta strim baharu, raf, yang membenarkan atur cara membaca dan menulis ke fail test.dat: RandomAccessFile raf = RandomAccessFile("test.dat", "rw");
Jika
test.datsudah wujud, raf dicipta untuk mengaksesnya; jika test.dat tidak wujud, fail baharu bernama test.dat dicipta dan raf dicipta untuk mengakses fail baharu. Kaedah raf.length() mengembalikan bilangan bait dalam test.dat pada bila-bila masa. Jika anda menambahkan data baharu ke dalam fail, raf.length() bertambah. Jika fail tidak bertujuan untuk diubah suai, bukanya dengan mod
r. Ini menghalang pengubahsuaian fail yang tidak disengajakan. Fail akses rawak terdiri daripada jujukan bait. Penanda khas yang dipanggil
penunjuk faildiletakkan pada salah satu bait ini. Operasi baca atau tulis berlaku di lokasi penuding fail. Apabila fail dibuka, penunjuk fail ditetapkan pada permulaan fail. Apabila anda membaca atau menulis data pada fail, penuding fail bergerak ke hadapan ke item data seterusnya. Contohnya, jika anda membaca nilai int menggunakan readInt(), JVM membaca 4 bait daripada penuding fail dan kini penuding fail ialah 4 bait mendahului lokasi sebelumnya, seperti ditunjukkan dalam Rajah di bawah.
Untuk
RandomAccessFile raf, anda boleh menggunakan kaedah raf.seek(position) untuk mengalihkan penuding fail ke kedudukan yang ditentukan. raf.seek(0) mengalihkannya ke permulaan fail dan raf.seek(raf.length()) mengalihkannya ke penghujung fail. Kod di bawah menunjukkan 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 < 200; i++) inout.writeInt(i); // Display the current length of the file System.out.println("Current file length is " + inout.length()); // Retrieve the first number inout.seek(0); // Move the file pointer to the beginning System.out.println("The first number is " + inout.readInt()); // Retrieve the second number inout.seek(1 * 4); // Move the file pointer to the second number System.out.println("The second number is " + inout.readInt()); // Retrieve the tenth number inout.seek(9 * 4); // Move the file pointer to the tenth number System.out.println("The tenth number is " + inout.readInt()); // Modify the eleventh number inout.writeInt(555); // Append a new number inout.seek(inout.length()); // Move the file pointer to the end inout.writeInt(999); // Display the new length System.out.println("The new length is " + inout.length()); // Retrieve the new eleventh number inout.seek(10 * 4); // Move the file pointer to the eleventh number System.out.println("The eleventh number is " + inout.readInt()); } } }Nombor pertama ialah 0
Nombor kedua ialah 1
Nombor kesepuluh ialah 9
Panjang baharu ialah 804
Nombor kesebelas ialah 555
Satu
dicipta untuk fail bernama inout.dat dengan mod rw untuk membenarkan kedua-dua operasi baca dan tulis dalam baris 8.
inout.setLength(0)menetapkan panjang kepada 0 dalam baris 11. Ini, sebenarnya, memusnahkan kandungan lama fail. Gelung
untukmenulis 200 int nilai daripada 0 hingga 199 ke dalam fail dalam baris 14 dan 15. Oleh kerana setiap int mengambil 4 bait, jumlah panjang fail yang dikembalikan daripada inout.length() kini 800 (baris 18), seperti yang ditunjukkan dalam output sampel.
Menyebut inout.seek(0) dalam baris 21 menetapkan penuding fail ke permulaan fail. inout.readInt() membaca nilai pertama dalam baris 22 dan mengalihkan penuding fail ke nombor seterusnya. Nombor kedua dibaca dalam baris 26.
inout.seek(9 * 4) (baris 29) mengalihkan penuding fail ke nombor kesepuluh. inout.readInt() membaca nombor kesepuluh dan mengalihkan penuding fail ke nombor kesebelas dalam baris 30. inout.write(555) menulis nombor kesebelas baharu pada kedudukan semasa ( baris 33). Nombor kesebelas sebelumnya dimusnahkan.
inout.seek(inout.length()) mengalihkan penuding fail ke hujung fail (baris 36). inout.writeInt(999) menulis 999 pada fail (baris 37). Kini panjang fail ditambah sebanyak 4, jadi inout.length() mengembalikan 804 (baris 40).
inout.seek(10 * 4) mengalihkan penuding fail ke nombor kesebelas dalam baris 43. Nombor kesebelas baharu, 555, dipaparkan dalam baris 44.
Atas ialah kandungan terperinci Fail Akses Rawak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!