Saat memproses file besar, jika Anda menggunakan FileInputStream biasa, FileOutputStream, atau RandomAccessFile untuk melakukan operasi baca dan tulis yang sering, prosesnya akan melambat karena sering membaca dan menulis memori eksternal. Berikut ini adalah percobaan perbandingan.
tes paket; impor java.io.bufferedInputStream; impor java.io.fileInputStream; impor java.io.filenotfoundException; impor java.io.ioException; impor java.io.randomaccessfile; impor java.nio.MappedByTeBuffer; impor java.nio.channels.filechannel; tes kelas publik {public static void main (string [] args) {coba {fileInputStream fis = FileInputStream baru ("/home/Tobacco/test/res.txt"); int sum = 0; int n; long t1 = system.currentTimemillis (); coba {while ((n = fis.read ())> = 0) {sum+= n; }} catch (ioException e) {// TODO AUTO-EME-GOYATED Catch Block E.PrintStackTrace (); } long t = system.currentTimeMillis ()-t1; System.out.println ("Sum:"+Sum+"Time:"+t); } catch (FileNoTFoundException e) {// TODO Auto-Encoerated Catch Block E.PrintStackTrace (); } coba {fileInputStream fis = FileInputStream baru ("/home/Tobacco/test/res.txt"); BufferedInputStream bis = baru bufferedInputStream (FIS); int sum = 0; int n; long t1 = system.currentTimemillis (); coba {while ((n = bis.read ())> = 0) {sum+= n; }} catch (ioException e) {// TODO AUTO-EME-GOYATED Catch Block E.PrintStackTrace (); } long t = system.currentTimeMillis ()-t1; System.out.println ("Sum:"+Sum+"Time:"+t); } catch (FileNoTFoundException e) {// TODO Auto-Encoerated Catch Block E.PrintStackTrace (); } MappedByTeBuffer buffer = null; coba {buffer = new randomAccessFile ("/home/tembakau/test/res.txt", "rw"). getchannel (). peta (filechannel.mapmode.read_write, 0, 1253244); int sum = 0; int n; long t1 = system.currentTimemillis (); untuk (int i = 0; i <1253244; i ++) {n = 0x000000ff & buffer.get (i); jumlah+= n; } long t = system.currentTimeMillis ()-t1; System.out.println ("Sum:"+Sum+"Time:"+t); } catch (FileNoTFoundException e) {// TODO Auto-Encoerated Catch Block E.PrintStackTrace (); } catch (ioException e) {// TODO AUTO-ENCEALATED Catch Block E.PrintStackTrace (); }}}File uji adalah file ukuran 1253244 byte. Hasil tes:
Jumlah: 220152087 Waktu: 1464
Jumlah: 220152087 Waktu: 72
Jumlah: 220152087 Waktu: 25
Ini berarti bahwa data dibaca dengan benar. Hapus bagian pemrosesan data.
tes paket; impor java.io.bufferedInputStream; impor java.io.fileInputStream; impor java.io.filenotfoundException; impor java.io.ioException; impor java.io.randomaccessfile; impor java.nio.MappedByTeBuffer; impor java.nio.channels.filechannel; tes kelas publik {public static void main (string [] args) {coba {fileInputStream fis = FileInputStream baru ("/home/Tobacco/test/res.txt"); int sum = 0; int n; long t1 = system.currentTimemillis (); coba {while ((n = fis.read ())> = 0) {// sum+= n; }} catch (ioException e) {// TODO AUTO-EME-GOYATED Catch Block E.PrintStackTrace (); } long t = system.currentTimeMillis ()-t1; System.out.println ("Sum:"+Sum+"Time:"+t); } catch (FileNoTFoundException e) {// TODO Auto-Encoerated Catch Block E.PrintStackTrace (); } coba {fileInputStream fis = FileInputStream baru ("/home/Tobacco/test/res.txt"); BufferedInputStream bis = baru bufferedInputStream (FIS); int sum = 0; int n; long t1 = system.currentTimemillis (); coba {while ((n = bis.read ())> = 0) {// sum+= n; }} catch (ioException e) {// TODO AUTO-EME-GOYATED Catch Block E.PrintStackTrace (); } long t = system.currentTimeMillis ()-t1; System.out.println ("Sum:"+Sum+"Time:"+t); } catch (FileNoTFoundException e) {// TODO Auto-Encoerated Catch Block E.PrintStackTrace (); } MappedByTeBuffer buffer = null; coba {buffer = new randomAccessFile ("/home/tembakau/test/res.txt", "rw"). getchannel (). peta (filechannel.mapmode.read_write, 0, 1253244); int sum = 0; int n; long t1 = system.currentTimemillis (); untuk (int i = 0; i <1253244; i ++) {//n=0x000000ff&buffer.get(i); // sum+= n; } long t = system.currentTimeMillis ()-t1; System.out.println ("Sum:"+Sum+"Time:"+t); } catch (FileNoTFoundException e) {// TODO Auto-Encoerated Catch Block E.PrintStackTrace (); } catch (ioException e) {// TODO AUTO-ENCEALATED Catch Block E.PrintStackTrace (); }}}Hasil tes:
Jumlah: 0 Waktu: 1458
Jumlah: 0 Waktu: 67
Jumlah: 0 Waktu: 8
Dapat dilihat bahwa setelah memetakan sebagian atau semua file ke memori untuk membaca dan menulis, kecepatannya akan jauh lebih tinggi.
Ini karena file yang dipetakan memori pertama memetakan file pada memori eksternal ke area kontinu dalam memori, dan diproses sebagai array byte. Operasi baca dan tulis beroperasi secara langsung pada memori, dan kemudian memetakan kembali area memori ke file memori eksternal, yang menghemat waktu untuk sering membaca dan menulis memori eksternal di tengah, sangat mengurangi waktu baca dan tulis.
Kode implementasi di atas untuk memproses file besar menggunakan pemetaan memori di Java adalah semua konten yang telah saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.