1. Konsep Dasar
IO adalah proses menyalin data dengan memori utama dan perangkat eksternal (hard disk, terminal, jaringan, dll.). IO adalah implementasi fungsional yang mendasari dari sistem operasi, yang diselesaikan melalui instruksi I/O.
Semua sistem runtime bahasa menyediakan alat tingkat tinggi untuk melakukan I/O. (C printfscanf, enkapsulasi berorientasi objek Java)
2. Ulasan Java Standard IO
Perpustakaan kelas IO Standard IO Standard adalah abstraksi dari IO objek yang berorientasi. Berdasarkan implementasi yang mendasari metode lokal, kami tidak perlu memperhatikan implementasi yang mendasarinya. InputStream/OutputStream: Transfer satu byte pada satu waktu. Pembaca/Penulis: Satu karakter pada satu waktu.
3.NIO PENDAHULUAN
Nio adalah singkatan dari Javanewio, API baru yang disediakan di JDK1.4. Karakteristik yang diklaim Sun secara resmi adalah sebagai berikut:
Menyediakan dukungan cache (buffer) untuk semua jenis primitif.
Solusi pengkodean dan decoding set karakter.
Saluran: Abstraksi I/O asli baru.
Mendukung antarmuka akses file untuk file terkunci dan memori yang dipetakan.
Menyediakan I/O jaringan non-bloking, non-blocking, sangat diskalakan.
Artikel ini akan belajar dan memperkenalkan fitur -fitur ini.
4.Buffer & Chanel
Saluran dan buffer adalah NIO dan merupakan dua abstraksi tipe data paling dasar.
Penyangga:
Ini adalah blok memori yang berkelanjutan.
Ini adalah tempat transit untuk membaca atau menulis data NIO.
Saluran:
Sumber data atau tujuan data
Antarmuka unik untuk menyediakan data ke buffer atau membaca data buffer, objek buffer.
Dukungan I/O Asinkron
Contoh 1: copyfile.java:
sampel paket; import java.io.fileInputStream; import java.io.fileOutputStream; import java.nio.bytebuffer; import java.nio.channels.fileChannel; copyfile kelas public {public static void (string [] args) lemparan pengecualian {string infile = "c: corping (string [] args) melempar pengecualian {string infile =" c: "corplopy" string (] args) lemparan Exception {string infile = "c:" cringcy "cringcy. C: //copy.txt "; // Dapatkan input dan output aliran sumber dan file target FileInputStream fin = FileInputStream baru (Infile); FileOutputStream fout = FileOutputStream baru (outfile); // dapatkan saluran input dan output fcin fcin = fin. Buffer bytebuffer = bytebuffer.allocate (1024); while (true) {// Metode CLEAR mengatur ulang buffer sehingga dapat menerima bacaan data buffer.clear (); // baca data dari saluran input ke buffer int r = fcin.read (buffer); // Baca metode mengembalikan jumlah byte yang dibaca, yang mungkin nol, jika saluran telah mencapai akhir aliran, pengembalian -1 ifer (yang mungkin terjadi (jika salurannya telah mencapai ujung aliran, return -1 if {returns -1 {retasan -1. Data yang baru dibaca ke buffer saluran lain.flip (); // tulis data dari saluran output ke buffer fcout.write (buffer);}}}Struktur internal buffer adalah sebagai berikut (gambar berikut disalin dari informasi):
Gambar 2: Buffer Struktur Internal
Buffer terutama mengontrol proses membaca dan menulis dengan posisi tiga variabel, batas, dan kapasitas. Arti dari ketiga variabel ini ditunjukkan pada tabel berikut:
parameter | Mode penulisan | Mode Membaca |
posisi | Jumlah data unit yang saat ini ditulis. | Lokasi data unit saat ini dibaca. |
membatasi | Ini mewakili jumlah maksimum unit data dan kapasitas yang dapat ditulis adalah sama. | Ini mewakili jumlah maksimum unit data yang dapat dibaca, yang konsisten dengan jumlah data unit yang ditulis sebelumnya. |
kapasitas | Kapasitas penyangga | Kapasitas penyangga |
Metode penyangga umum:
flip (): Konversi mode tulis ke mode membaca
Rewind (): Reset posisi ke 0, umumnya digunakan untuk membaca berulang.
clear (): Hapus buffer dan bersiap untuk ditulis lagi (posisi menjadi 0, batas menjadi kapasitas).
Compact (): Salin data yang belum dibaca ke kepala buffer.
Mark (), reset (): Mark dapat menandai posisi, reset dapat diatur ulang ke posisi ini.
Jenis Buffer Umum: Bytebuffer, MappedByTeBuffer, Charbuffer, Doublebuffer, FloatBuffer, IntBuffer, Longbuffer, Shortbuffer.
Saluran Umum: FileChannel, Datagramchannel (UDP), Socketchannel (TCP), ServerSocketchannel (TCP)
Tes kinerja sederhana dilakukan pada mesin ini. Laptop saya berkinerja sedang. (Lihat lampiran untuk kode spesifik. Lihat contoh di bawah ini di Paket Nio.Sample.fileCopy) Berikut ini adalah data referensi:
Skenario 1: Salin file 370m
Skenario 2: Tiga utas menyalin pada saat yang sama, setiap utas menyalin file 370m.
Pemandangan | FileInputStream+ FileOutputStream | FileInputStream+ BufferedInputStream+ FileOutputStream | Bytebuffer+ FileChannel | MappedByTeBuffer +FileChannel |
Adegan untuk sementara waktu (milidetik) | 25155 | 17500 | 19000 | 16500 |
Adegan 2 waktu (milidetik) | 69000 | 67031 | 74031 | 71016 |
5.NiO.Charset
Pengkodean dan decoding karakter: bytecode itu sendiri hanyalah beberapa angka, yang diuraikan dengan benar dalam konteks yang benar. Saat menyimpan data ke Bytebuffer, Anda perlu mempertimbangkan metode pengkodean dari set karakter. Saat membaca dan menampilkan data BYTEBUFFER, Anda melibatkan decoding set karakter.
Java.nio.charset menyediakan serangkaian solusi untuk pengkodean dan decoding.
Mengambil permintaan HTTP kami yang paling umum sebagai contoh, permintaan harus dikodekan dengan benar saat meminta. Respons harus diterjemahkan dengan benar saat diperoleh.
Kode berikut mengirimkan permintaan ke Baidu dan mendapatkan hasil untuk tampilan. Contohnya menunjukkan penggunaan charset.
Contoh 2baidureader.java
Paket nio.readpage; impor java.nio.bytebuffer; impor java.nio.channels.socketchannel; import java.nio.charset.charset; import java.net.inetsocketaddress; import java.io.ioException; kelas publik baidureader {private charset = charset. "charsception; class public Baidureader {private charset (co Creation = {creation {private charset = coation {public coucke.net {public coCinger {public clace Karakter Set Private Socketchannel Channel; public void readHtmlContent () {coba {inetsocketAddress socketAddress = inetsocketAddress baru ("www.baidu.com", 80); // step1: buka connection channel = socketnel.open (socketaddress); // step1: kirim/kirimkan (kirim socketnel.open (socketaddress); // step1: kirim/kirim itu, kirimkan, socketnel.open (socketaddress); // step1: kirim/kirimkan: socketnel.open. Http/1.1 " +"/r/n/r/n ")); // Langkah3: Baca data BytEbuffer buffer = byteBuffer.allocate (1024); // Buffer 1024 -byte Buffer while (channel.read (buffer)! = -1) {buffer.flip (); // Metode flip (buffer)! System.out.println (charset.decode (buffer)); // Gunakan metode charset.decode untuk mengonversi byte menjadi string buffer.clear (); // clear buffer}} catch (ioException e) {System.err.println (e.tostring ());} akhirnya {if (channeler! (IoException e) {}}}} public static void main (string [] args) {new baidureader (). ReadHtmlContent ();}}6. IO non-blocking
Mengenai IO yang tidak memblokir, kami akan memahami dari aspek-aspek dari apa yang memblokir, apa yang tidak diblokir, prinsip non-blocking dan API inti asinkron.
Apa itu penyumbatan?
Proses komunikasi IO jaringan umum adalah sebagai berikut:
Dari proses komunikasi jaringan ini, mari kita pahami apa itu pemblokiran:
Jika koneksi belum tiba dalam proses di atas, maka terima Will Block, program harus digantung setelah berjalan di sini, dan CPU malah akan menjalankan utas lainnya.
Jika data belum siap dalam proses di atas, bacaan juga akan diblokir.
Fitur dari Blocking Network IO: multi-threading beberapa koneksi. Setiap utas memiliki ruang tumpukan sendiri dan menghabiskan waktu CPU. Setiap utas akan diblokir saat bertemu dengan eksternal siap. Hasil pemblokiran adalah bahwa hal itu akan menyebabkan sejumlah besar switching konteks proses. Dan sebagian besar proses pengalihan konteks mungkin tidak ada artinya. Misalnya, misalkan utas mendengarkan port, dan hanya akan ada beberapa permintaan dalam sehari, tetapi CPU harus terus melakukan upaya switching konteks untuk utas, dan sebagian besar switching berakhir dalam pemblokiran.
Apa itu non-blocking?
Ini metafora:
Di bus dari A ke B, ada banyak poin di jalan yang mungkin turun. Pengemudi tidak tahu poin mana yang akan turun dari bus. Bagaimana cara berurusan dengan mereka yang perlu turun dari bus dengan lebih baik?
1. Selama proses, pengemudi secara teratur bertanya kepada setiap penumpang apakah dia telah tiba di tujuan. Jika seseorang mengatakan itu, pengemudi berhenti dan penumpang turun. (Mirip dengan pemblokiran)
2. Semua orang memberi tahu penjual tiket tujuan mereka dan kemudian tidur. Pengemudi hanya berinteraksi dengan penjual tiket. Ketika dia tiba pada titik tertentu, penjual tiket akan memberi tahu penumpang untuk turun dari bus. (Mirip dengan non-blocking)
Jelas, semua orang untuk mencapai tujuan dapat dianggap sebagai utas, dan pengemudi dapat dianggap sebagai CPU. Dalam gaya pemblokiran, setiap utas perlu terus -menerus polling dan beralih konteks untuk mencapai hasil menemukan tujuan. Dalam mode non-blocking, setiap penumpang (utas) sedang tidur (tidur) dan hanya bangun ketika lingkungan eksternal yang sebenarnya siap. Bangun seperti itu pasti tidak akan memblokir.
Prinsip non-blocking
Ganti seluruh proses ke tugas -tugas kecil dan selesaikan melalui kolaborasi antar tugas.
Utas khusus menangani semua acara IO dan bertanggung jawab atas distribusi.
Mekanisme yang digerakkan oleh peristiwa: memicu ketika suatu peristiwa tiba, daripada memantau peristiwa secara bersamaan.
Komunikasi Thread: Thread berkomunikasi melalui menunggu, memberi tahu dan cara lainnya. Pastikan setiap sakelar konteks masuk akal. Kurangi switching proses yang tidak perlu.
Berikut ini adalah struktur IO asinkron:
Reaktor adalah peran metaforis di atas dari penjual tiket. Aliran pemrosesan masing -masing utas mungkin membaca data, mendekode, menghitung pemrosesan, menyandikan, dan mengirim respons.
API inti IO asinkron
Pemilih
Kelas inti IO asinkron, yang dapat mendeteksi peristiwa di satu atau lebih saluran dan mendistribusikan acara.
Gunakan utas pilih untuk mendengarkan acara di beberapa saluran dan memicu respons yang sesuai berdasarkan driver acara. Tidak perlu mengalokasikan utas untuk setiap saluran.
Seleksi
Berisi ikatan saluran yang sesuai dengan informasi status acara dan waktu.
Meringkaskan
Di atas adalah seluruh konten artikel ini tentang esai pengetahuan java dasar, saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!