Acak ACCEACTSFILE
RandomAccessFile digunakan untuk mengakses file yang menyimpan catatan data. Anda dapat menggunakan metode pencarian () untuk mengakses catatan dan membaca dan menulis. Ukuran catatan ini tidak harus sama; Namun, ukuran dan posisinya harus diketahui. Namun, kelas ini terbatas pada file operasi.
RandomAccessFile bukan milik kelas InputStream dan OutputStream. Faktanya, selain mengimplementasikan antarmuka DataInput dan DataOutput (DataInputStream dan DataOutputStream juga mengimplementasikan kedua antarmuka ini), tidak ada hubungannya dengan dua kelas ini, dan bahkan tidak menggunakan fungsi apa pun yang sudah ada di kelas InputStream dan OutputStream; Ini adalah kelas yang sepenuhnya independen, dan semua metode (kebanyakan hanya milik dirinya sendiri) ditulis dari awal. Ini mungkin karena RandomAccessFile dapat bergerak bolak -balik dalam file, sehingga perilakunya agak berbeda secara fundamental dari kelas I/O lainnya. Singkatnya, ini adalah kelas terpisah yang secara langsung mewarisi objek.
Pada dasarnya, metode kerja acakeCacSFile adalah untuk menggabungkan datasinputstream dan dataoutputStream, dan menambahkan beberapa metode sendiri, seperti getFilePointer () untuk pemosisian, seek () untuk bergerak dalam file, dan menentukan panjang () untuk ukuran file, dan skipbytes () untuk dilewati oleh berapa banyak byte yang dilewati. Selain itu, konstruktornya juga memiliki parameter yang menunjukkan apakah akan membuka file dalam mode baca-saja ("r") atau mode baca-tulis ("RW") (persis sama dengan fopen () dari C). Itu tidak mendukung file penulisan saja.
Hanya RandomAccessFile yang memiliki metode pencarian pencarian, dan metode ini hanya berlaku untuk file. BufferedInputStream memiliki metode mark (), yang dapat Anda gunakan untuk mengatur tanda (simpan hasil dalam variabel internal), dan kemudian panggilan reset () untuk kembali ke posisi ini, tetapi fungsinya terlalu lemah dan tidak terlalu praktis.
Sebagian besar fungsi acakeCcessFile, tetapi tidak semua, telah digantikan oleh "file yang dipetakan memori" dari JDK 1.4. Anda harus mempertimbangkan apakah akan menggunakan "file yang dipetakan memori" alih-alih acakeCcessFile.
impor java.io.ioException; impor java.io.randomaccessfile; kelas publik tesrandomAccessFile {public static void main (string [] args) melempar ioException {randomAccessFile rf = new randomAccessFile ("rtest.dat", "rw"); untuk (int i = 0; i <10; i ++) {// tulis tipe dasar data ganda rf.writedouble (i * 1.414); } rf.close (); rf = new randomAccessFile ("rtest.dat", "rw"); // Putar langsung pindahkan pointer file ke data ganda ke -5 RF.SEEK (5 * 8); // Timpa Data Ganda ke -6 RF.Writedouble (47.0001); rf.close (); rf = new randomAccessFile ("rtest.dat", "r"); untuk (int i = 0; i <10; i ++) {System.out.println ("value" + i + ":" + rf.readdouble ()); } rf.close (); }}File yang dipetakan memori
File yang dipetakan memori memungkinkan Anda untuk membuat dan memodifikasi file yang terlalu besar untuk dimori. Dengan file yang dipetakan memori, Anda dapat berpikir bahwa file tersebut telah dibaca ke dalam memori dan mengaksesnya sebagai array yang sangat besar. Solusi ini dapat sangat menyederhanakan kode memodifikasi file.
filechannel.map (filechannel.mapmode mode, posisi panjang, ukuran panjang) memetakan area file saluran ini langsung ke memori. Perhatikan bahwa Anda harus menunjukkan dari mana peta itu dan seberapa besar jangkauan peta; Artinya juga dapat memetakan fragmen kecil dari file besar.
MappedByTeBuffer adalah subclass dari BytEbuffer, sehingga memiliki semua metode BytEbuffer, tetapi gaya baru () ditambahkan untuk memaksa menyegarkan konten buffer ke perangkat penyimpanan, memuat () memuat data dalam perangkat penyimpanan ke dalam memori, dan diload () di lokasi memori apakah data dalam memori disinkronkan dengan penyimpanan, dan penyimpanan. Di sini kami hanya mendemonstrasikan metode put () dan get () secara singkat. Selain itu, Anda juga dapat menggunakan metode seperti AscharBuffer () untuk mendapatkan tampilan buffered dari data tipe dasar yang sesuai, yang dapat dengan mudah membaca dan menulis data tipe dasar.
impor java.io.randomaccessfile; impor java.nio.MappedByTeBuffer; impor java.nio.channels.filechannel; kelas publik largemappedFiles {static int length = 0x8000000; // 128 MB public static void main (string [] args) melempar Exception {// Untuk membuka file dengan cara yang dapat dibaca dan dapat ditulis, RandomAccessFile digunakan di sini untuk membuat file. Filechannel fc = new randomAccessFile ("test.dat", "rw"). Getchannel (); // Perhatikan bahwa saluran file yang dapat dibaca dan dapat ditulis harus didasarkan pada aliran file yang dapat dibaca dan dapat ditulis sendiri. MappedByTeBuffer out = fc.map (filechannel.mapmode.read_write, 0, panjang); // tulis konten 128m untuk (int i = 0; i <panjang; i ++) {out.put ((byte) 'x'); } System.out.println ("Menulis Selesai"); // Baca 6 byte dari tengah file untuk (int i = panjang / 2; i <panjang / 2+6; i ++) {System.out.print ((char) out.get (i)); } fc.close (); }}Meskipun tampaknya FileOutputStream digunakan untuk menulis pemetaan, semua output dalam file pemetaan harus menggunakan acak ACCEACCESSFILE, tetapi jika Anda hanya perlu membaca FileInputStream, Anda harus menggunakan file akses acak saat menulis file pemetaan. Mungkin alasan membaca saat menulis.
Program ini membuat file 128MB. Jika Anda membaca memori pada satu waktu, itu dapat menyebabkan overflow memori, tetapi akses di sini tampaknya hanya sesaat, karena hanya sebagian kecil darinya yang benar -benar ditransfer ke dalam memori, dan sisanya ditempatkan pada file swap. Dengan cara ini Anda dapat dengan mudah memodifikasi file super besar (hingga 2 GB). Perhatikan bahwa Java menyebut "mekanisme pemetaan file" sistem operasi untuk meningkatkan kinerja.
Aplikasi Kelas AcomesAccessFile:
/ * * Fungsi Program: Demonstrasi operasi kelas acakAccessFile dan terapkan operasi salinan file. */ paket com.lwj.demo; impor java.io.*; Public Class RandomAccessFileMo {public static void main (String [] args) melempar Exception {RandomAccessFile File = new RandomAccessFile ("File", "RW"); // Berikut ini menulis data ke file file.writeint (20); // Ini menempati file 4 byte.writedouble (8.236598); // Ini menempati file 8 byte.writeutf ("Ini adalah string UTF"); // Panjang ini ditulis dalam dua byte pertama dari pointer file saat ini. File.writeboolean (true); // menempati file 1 byte.writeshort (395); // menempati file 2 byte.writelong (2325451l); // menempati file 8 byte.writeutf ("string UTF lain"); file.writefloat (35.5f); // menempati file 4 byte.writechar ('a'); // menempati file 2 byte. Perhatikan lokasi file pointer System.out.println ("―6 ―6:] secara ―666666AN - - kata; ―6; System.out.println (File.readint ()); System.out.println (file. pointer oleh 3 byte, dan dalam hal ini nilai boolean dan nilai pendek dilewati. System.out.println (file.readfloat ()); // berikut ini menunjukkan sistem operasi salinan file.out.println ("―6 ―6 - - - - - - - - - - - File.seek (0); Panjang AcomencessFile = LEENCECKECSFILE (" FileCopy "," RW "); byte [] b byte baru [len]; Contoh Penulisan Penyisipan AcomesAccessFile:
/ **** @param Lewati berapa banyak byte untuk dilewati untuk memasukkan data* @param str string untuk memasukkan* @param file nama file*/ public static void beiju (loncatan panjang, string str string, string filename) {coba {acakAccessFile raf = randomAccessFile baru (fileName, "rw"); if (lewati <0 || skip> raf.length ()) {System.out.println ("Lewati jumlah byte yang dilewati tidak valid"); kembali; } byte [] b = str.getbytes (); raf.setLength (raf.length () + b.length); untuk (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 (temp); } raf.seek (lewati); raf.write (b); raf.close (); } catch (Exception e) {E.PrintStackTrace (); }}Gunakan RandomAccessFile untuk mewujudkan unduhan file multi-threaded, yaitu, ketika beberapa utas mengunduh file, file dibagi menjadi beberapa bagian, dan setiap bagian diunduh dengan utas yang berbeda. Berikut adalah contoh penggunaan multithreading saat menulis file, di mana ruang yang diperlukan untuk file tersebut dialokasikan sebelumnya, kemudian dipotong di ruang yang dialokasikan, dan kemudian ditulis:
impor java.io.filenotfoundException; impor java.io.ioException; impor java.io.randomaccessfile; /*** Tes Menggunakan Multithreading untuk Operasi Penulisan File*/Tes Kelas Publik {public static void main (string [] args) melempar Exception {// Space Disk Pra-Allocated, file dari ukuran yang ditentukan akan dibuat pada Disk RandomAccessFile RAF = RandomAccessFile baru ("D: //ABC.TXT", ",", ",", ",", "D: //ABC.TXT", ",", "D: //ABC.TXT"); raf.setlength (1024*1024); // ruang file 1m pra-dialokasikan raf.close (); // file konten yang akan ditulis string s1 = "string pertama"; String s2 = "string kedua"; String s3 = "string ketiga"; String s4 = "string keempat"; String s5 = "string kelima"; // Tulis file secara bersamaan menggunakan beberapa utas FileWritethread baru (1024*1, s1.getbytes ()). Start (); // Tulis data dari 1024 byte file baru filewritethread (1024*2, s2.getbytes ()). Start (); // Tulis data dari 2048 byte file baru filewritethread (1024*3, s3.getbytes ()). Start (); // Tulis data dari 3072 byte file baru filewritethread (1024*4, s4.getbytes ()). Start (); // Tulis data dari 4096 byte file baru filewritethread (1024*5, s5.getbytes ()). Start (); // Tulis data dari 5120 byte file} // Gunakan utas untuk menulis data yang ditentukan di lokasi yang ditentukan dari file statis File FileWritethread Extends Thread {private int skip; konten byte pribadi []; public filewritethread (int skip, byte [] konten) {this.skip = lewati; this.content = konten; } public void run () {randomAccessFile raf = null; coba {raf = randomAccessFile baru ("d: //abc.txt", "rw"); raf.seek (lewati); raf.write (konten); } catch (FileNotFoundException e) {e.printstacktrace (); } catch (ioException e) {// TODO AUTO-ENCEALATED Catch Block E.PrintStackTrace (); } akhirnya {coba {raf.close (); } catch (Exception e) {}}}}}}}Penjelasan terperinci tentang penggunaan Java RandomAccessFile di atas adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.