Dengan perkembangan pesat teknologi Internet, permintaan untuk pelbagai sistem aplikasi berskala besar terus meningkat, dan keperluan untuk operasi IO yang cekap menjadi semakin mendesak. Sebagai bahasa pengaturcaraan yang biasa digunakan, Java semakin banyak digunakan dalam operasi IO. Fungsi NIO, sebagai kaedah pelaksanaan operasi IO yang cekap, juga telah menarik banyak perhatian dalam beberapa tahun kebelakangan ini. Artikel ini akan memperkenalkan cara menggunakan fungsi NIO dalam Java untuk melaksanakan operasi IO yang cekap.
1. Pengenalan kepada NIO
NIO, atau I/O Baharu, ialah API IO baharu yang diperkenalkan dalam versi Java 1.4 Berbanding dengan API IO tradisional, NIO melaksanakan operasi IO yang tidak menyekat. API IO tradisional adalah berorientasikan aliran, manakala NIO berorientasikan blok. Kelemahan penstriman IO ialah apabila fail besar perlu dibaca dan ditulis, banyak masalah menyekat IO membaca dan menulis akan berlaku, yang menjejaskan kecekapan program secara serius. Sekat IO boleh mengelakkan sekatan IO yang tidak perlu dan meningkatkan kecekapan operasi IO apabila membaca dan menulis blok data. Pada masa yang sama, NIO juga menyediakan mekanisme pemultipleksan (Multiplexing) yang cekap, yang boleh memantau berbilang peristiwa IO pada masa yang sama dan meningkatkan kecekapan komunikasi rangkaian.
2. Penggunaan NIO
Kelas Penampan dalam NIO ialah salah satu kelas teras, dan fungsinya adalah untuk cache membaca dan menulis data. Berbeza daripada API IO tradisional, Penimbal dalam NIO mempunyai peraturan tertentu untuk membaca dan menulis data Contohnya, sebelum menulis data, anda perlu memanggil kaedah Buffer.flip() untuk menetapkan semula penunjuk tulis penimbal untuk operasi membaca. Kelas Penampan mempunyai banyak kaedah lain, seperti position(), limit(), capacity(), dsb., yang boleh digunakan mengikut keperluan. Di samping itu, terdapat pelbagai kelas Penampan dalam NIO, seperti ByteBuffer, CharBuffer, IntBuffer, dsb., digunakan untuk menyimpan pelbagai jenis data.
Selain kelas Buffer, kelas Channel juga merupakan salah satu kelas teras dalam NIO Fungsinya adalah untuk membaca dan menulis data. Kelas Saluran dalam NIO termasuk pelbagai jenis saluran, seperti FileChannel, DatagramChannel, dsb. Tidak seperti API IO tradisional, kelas Saluran dalam NIO boleh melaksanakan operasi IO tanpa sekatan.
Kelas Pemilih dalam NIO ialah kelas utama untuk melaksanakan pemultipleksan dalam NIO. Kelas Pemilih boleh memantau berbilang Saluran Apabila satu atau lebih Saluran mempunyai data yang boleh dibaca atau ditulis, Pemilih akan memberitahu Saluran yang sepadan untuk melaksanakan operasi baca dan tulis. Menggunakan kelas Selector boleh mengelak daripada mencipta berbilang benang untuk membaca dan menulis berbilang Saluran, dengan itu meningkatkan kecekapan program.
3. Contoh NIO
Yang berikut menggunakan contoh untuk menggambarkan penggunaan NIO. Katakan terdapat fail, dan data dalam fail itu perlu dibaca baris demi baris dan output ke konsol.
FileChannel boleh membaca kandungan fail melalui kaedah berikut:
public static void readFile(String fileName) throws IOException{ FileInputStream fis = new FileInputStream(fileName); FileChannel fc = fis.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); while(fc.read(buffer) != -1){ buffer.flip(); while(buffer.hasRemaining()){ System.out.print((char)buffer.get()); } buffer.clear(); } fc.close(); fis.close(); }
Dalam kod, mula-mula dapatkan saluran fail FileChannel melalui FileInputStream, kemudian buat penimbal ByteBuffer, dan nyatakan saiz penimbal menjadi 1024 . Apabila membaca fail, baca melalui kaedah fc.read(buffer) dan tentukan sama ada bacaan selesai. Jika bacaan tidak selesai, panggil kaedah buffer.flip() untuk menetapkan semula kedudukan dan had penimbal. Selepas setiap gelung membaca data dalam penimbal, anda perlu menetapkan kedudukan penimbal kepada 0 dan had kepada kapasiti penimbal, supaya penimbal boleh digunakan semula.
Anda boleh menggunakan kelas LineIterator untuk melaksanakan bacaan baris demi baris:
public static void readLine(String fileName) throws IOException{ FileInputStream fis = new FileInputStream(fileName); FileChannel fc = fis.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); Charset charset = Charset.forName("UTF-8"); LineIterator iterator = new LineIterator(charset.newDecoder()); while(fc.read(buffer) != -1){ buffer.flip(); iterator.read(buffer, new LineHandler() { @Override public boolean handle(String line) throws Exception { System.out.println(line); return true; } @Override public void endOfFile() throws Exception { System.out.println("End of File."); } }); buffer.compact(); } iterator.finish(); fc.close(); fis.close(); }
Dalam kod, mula-mula buat objek LineIterator dan nyatakan pengekodan set aksara sebagai UTF-8 . Apabila membaca kandungan fail, baca kandungan fail baris demi baris melalui kaedah iterator.read(buffer,LineHandler). Kaedah pemegang(String line) dalam antara muka LineHandler digunakan untuk memproses baris bacaan data, dan kaedah endOfFile() digunakan untuk memproses situasi apabila bacaan fail tamat. Dalam kaedah pemegang, anda boleh memproses baris data yang anda baca, seperti mengeluarkannya ke konsol. . Dalam gelung sementara, pantau peristiwa IO melalui kaedah select() Selector. Apabila satu atau lebih peristiwa IO yang didaftarkan oleh Saluran dicetuskan, Pemilih akan mengembalikan SelectionKey yang sepadan. Anda boleh menggunakan kaedah SelectionKey.isAcceptable() untuk menentukan jenis SelectionKey dan melaksanakan operasi, seperti mendaftarkan operasi OP_READ bagi SocketChannel.
Atas ialah kandungan terperinci Cara menggunakan fungsi NIO untuk operasi IO yang cekap di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!