Aké vlastnosti NIO (Nový Vstup/Výstup) poznáte?
Odpoveď od AI
sobes.tech AI
NIO poskytuje nekontrolovaný vstup/výstup založený na kanáloch a vyrovnávacích pamätiach. Kľúčové vlastnosti:
-
Kanály (Channels): Predstavujú otvorené spojenie s entitou schopnou vykonávať I/O operácie (súbor, soket). Na rozdiel od prúdov (Streams), kanály môžu vykonávať ako čítanie, tak písanie.
-
Vyrovnávacie pamäte (Buffers): Predstavujú pevné bloky pamäte používané na interakciu kanálov s dátami. Dáta z kanála sa zapisujú do vyrovnávacej pamäte a následne spracúvajú. Alebo sa dáta z programu zapisujú do vyrovnávacej pamäte a následne do kanála. Vyrovnávacie pamäte umožňujú efektívnejšie riadenie pamäte.
-
Selektory (Selectors): Umožňujú jednému vláknu spracovávať I/O operácie na viacerých kanáloch. Toto je kľúčová vlastnosť pre implementáciu nekontrolovaného I/O, pretože vlákno môže čakať na pripravenosť viacerých kanálov na vykonanie operácií (čítanie alebo písanie).
-
Nekontrolovaný I/O: Vlákno vykonávajúce operáciu čítania alebo písania cez kanál sa neblokuje do ukončenia operácie. Namiesto toho môže vykonávať iné úlohy, kým dáta nie sú dostupné alebo buffer je pripravený na zápis. Spôsobilosť (Readiness) kanála na operáciu sa kontroluje cez selektor.
-
MappedByteBuffer: Buffer, ktorý vykonáva priame mapovanie súboru do pamäte procesu. To môže významne zvýšiť výkon pre veľké súbory, vyhýbaním sa kopírovaniu dát z jadra do používateľského priestoru.
-
Scatter/Gather I/O: Umožňuje čítať dáta z jedného kanála do viacerých bufferov (scatter) alebo zapisovať dáta z viacerých bufferov do jedného kanála (gather) za jednu operáciu.
Príklad použitia Selector:
// Príklad registrácie kanála v selektore pre operáciu čítania
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false); // Prepneme kanál do nekontrolovaného režimu
Selector selector = Selector.open();
channel.register(selector, SelectionKey.OP_READ); // Zaregistrujeme kanál na sledovanie pripravenosti na čítanie
Príklad použitia MappedByteBuffer:
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
// Otvorenie súboru a získanie kanála
// RandomAccessFile raf = new RandomAccessFile("large_file.txt", "rw");
// FileChannel fileChannel = raf.getChannel();
// Mapovanie súboru do pamäte
// MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, fileChannel.size());
// Práca s bufferom
// byte b = buffer.get(); // Čítanie bajtu
// buffer.put(0, (byte) 65); // Zápis bajtu