Rumah  >  Artikel  >  Java  >  Fail Akses Rawak

Fail Akses Rawak

王林
王林asal
2024-07-18 19:08:51952semak imbas

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).

Image descriptionApabila 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.dat

sudah 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 fail

diletakkan 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.

Image descriptionUntuk

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.

Panjang fail semasa ialah 800
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

RandomAccessFile

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

untuk

menulis 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn