2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Praecipuam cognitionem NIO in ava gradu describit, pro basic recognitione
In Java, NIO (Non-obturans I/O vel Novum I/O) nova copia input/output operationis API in Java SE 1.4 et versionibus subsequentibus introducta est.
Comparato exemplari translaticio IO, altiorem efficientiam ac magis concurrentem capacitatem processus praebet. Clavis notae NIO est eius pluma non-obclusio, quae unum filum ad plures canales I/O administrandum permittit, eoque magis meliore applicatione effectus in missionibus summus concursus est.
Usus missionis Javae NIO apprime convenit pro condicionibus in quibus magnus numerus coniunctionum concurrentium ad discursum opus est. Exempli gratia, in servo retis, unum linum administrare potest milia hospitum clientium sine necessitate ut filum independens pro singulis connexionibus collocare possit. . Potest signanter minuere systema resource consummatio et amplio facultates processui
Channel est medium notitiarum influentium in Java NIO. Bidirectionale est et ad data vel scribenda notitia adhiberi potest. Praecipua utilitas canalium est quod non-obturbant, quod significat unum linum posse plures canales administrare. Cum nullae eventus in canali occurrent, filum non obstruetur et alia negotia tractari potest. Pelagus channel types includit:
FileChannel
: pro lima operationes legere et scribere. Potest adhiberi ut notitias ex quiddam tabellae scribere, vel notitias ex tabella legere in quiddam.SocketChannel
: TCP nexus in communicationibus retis adhiberi possunt, ac legere et scribere notitias adhiberi possunt.ServerSocketChannel
: novos hospites SocketChannel accipiebant, similes traditionibus ServerSocket.DatagramChannel
: Pro communicatione UDP adhibita, quae mittere et accipere potest datagrams.Obiectum quiddam est notitiarum copiarum in NIO. Est byte ordinata quae notitias scribere et notitias ex eo legere potest. Aliquid quiddam habet capacitatis specificae et duas praecipuas proprietates habet: situm et modum.
Genera sunt buffersByteBuffer
、CharBuffer
、ShortBuffer
、IntBuffer
、LongBuffer
、FloatBuffer
etDoubleBuffer
unaquaeque typum primitivae notae typi respondet.
Lector multiplex in NIO est qui unum filum ad monitorias eventus ex multiplicibus canalibus praebet, ut legere, scribere, coniungere, eventa accipere. Lector notificat applicationem cum unus e canalibus paratus est ad operationes I/O. Usus selectorum valde melioratur concursus processus facultatum applicationum retis, quia non opus est filo pro singulis connexionibus creare.
Summa methodorum selectorum includit:
select()
: Caudices usque ad unum saltem alveum I/O operationibus paratum est.selectedKeys()
: Redit Pone continens objecta SelectionKey omnium canalium praeparatorum.wakeup()
: Interpellare claususselect()
translatio.SelectionKey
Est consociatio inter selectores et canales.
Hoc est exemplar antiquissimum I/O. Hoc modo, cum filum legere vel scribere operationem inchoat, linum impeditur donec operatio I/O perficiatur. Si nulla data est operatio legere legere, vel operatio scribe statim perfici non potest, sequela exspectabit donec operatio compleatur.
Features:
Non-obstructionum I/O pars est compagis Javae NIO (Novi I/O) quae fila sine interclusa operationes legere et scribere sinit. Si nulla data sit legere operatio legere, aut operatio scribentis statim perfici non potest, linum non suspenditur et alia negotia pergere potest.
Features:
Multiplexio est ad monitorem multiplex fasciculi descriptorum simul per unum linum, et solum in descriptor cum promptum est (solet enim notitia legere est, vel scribere quiddam est writable). Selectores in Java ad multiplicationem efficiendam adhibentur.
Features:
Animadverte:
In applicationibus non interclusio I/O saepe in coniunctione cum multiplicatione adhibetur. Exempli gratia, cultor Selector ad monitorem multiplex SocketChannels uti potest. Cum SocketChannel notitias habet quae legi vel scriptae possunt, Selector servo certiorem faciet, et server hoc SocketChannel specificum processit in modo non-obstructio.
In Java, Flumine et Channel sunt duo diversi modi processus notitiarum rivulorum. Illi ad vexillum IO bibliothecae Javae et ad bibliothecam NIO pertinent. Hic accurata comparatio duorum notionum est;
Amnis pars exemplar vexillum Javae IO (io obturans) praebet, quod viam sequenti modo legendi et scribendi praebet. Amnis in duo genera dividitur: InputStream et OutputStream, quae notitias respective legere et scribere solebant.Hi rivi byte rivi esse possunt (utInputStream
, OutputStream
) Vel ingenii amnis (utReader
, Writer
)。
Features:
close()
methodum facultates dimittere.Incipiens a Java 7, statim propositio potest exsequendam exsequendam operam cum opibusAutoCloseable
Interface facultates, inter Stream. Channel ad exemplar Javae NIO (New IO) pertinet, quod altiorem gradum abstractionis quam Fluvius praebet, efficacius notitiarum processus permittens. Canales bidirectionales esse possunt, significationes datas legere et scribere possunt.Pelagus Channel types includitFileChannel
、SocketChannel
、ServerSocketChannel
etDatagramChannel
。
Features:
Summatim
In Java, I/O exempla operationis distingui possunt secundum duas dimensiones synchronae/asynchronae et interclusionis/non-obstructionis.
definition : Synchronum interclusio I/O est exemplar maxime traditum I/O. Cum linum vocat operationem I/O (ut legendi vel scribendi), filum obstruetur donec operatio perficiatur. Id est quod filum alia opera praestare non potest donec operatio compleatur.
Features:
InputStream
、OutputStream
、Socket
etServerSocket
ferenti.Exemplum:
Utere traditionalInputStream
etOutputStream
Legere et scribere files:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class SyncBlockingIOExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
definition : Synchrono non-obstructione I/O, filum post operationem I/O vocato non obstruetur. Si operatio statim perfici non potest, modus statim revertetur, plerumque valorem specialem reddens (ut -1 vel 0) vel exceptionem ad indicandum coniectans operationem non completam.
Features:
Channels
etBuffers
vocandoconfigureBlocking(false)
Constitue alveo non-obturans modus.Exemplum:
NIO utensFileChannel
Nam non- interclusio lectionis et scribendi;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.ByteBuffer;
public class SyncNonBlockingIOExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt");
FileChannel inChannel = fis.getChannel();
FileChannel outChannel = fos.getChannel()) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
inChannel.configureBlocking(false);
while (inChannel.read(buffer) > 0) {
buffer.flip();
outChannel.write(buffer);
buffer.clear();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
definition: Synchrona multiplexed I/O exemplar ususSelector
(Selector) ad Monitor multiplexChannel
eventum.Cum filum vocatSelector.select()
, impediet donec unus saltem sitChannel
Events (ut readable, writable, nexum petitionem, etc.) occurrunt.
Features:
Channel
melius concurrit.Selector
etSelectionKey
Mechanismus, qui magnum numerum coniunctionum concurrentium efficienter tractare potest.Exemplum:
NIO utensFileChannel
Nam non- interclusio lectionis et scribendi;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Set;
public class SyncMultiplexingIOExample {
public static void main(String[] args) throws IOException {
try (Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) {
serverSocketChannel.socket().bind(new InetSocketAddress(8080));
serverSocketChannel.configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
if (selector.select() > 0) {
Set<SelectionKey> keys = selector.selectedKeys();
for (SelectionKey key : keys) {
if (key.isAcceptable()) {
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
SocketChannel clientChannel = ssc.accept();
clientChannel.configureBlocking(false);
clientChannel.register(selector, SelectionKey.OP_READ);
}
}
keys.clear();
}
}
}
}
}
definition : In exemplari asynchrono non-obstructione I/O, filum statim redit post initium I/O operationis non expectata operatione ad perficiendum. Cum operatione perfecta est, sequela asynchrone notificabitur per munus callback vel eventum notificationis.
Features:
AsynchronousChannel
Interface et exsecutionem generis eius, utAsynchronousFileChannel
etAsynchronousSocketChannel
。Exemplum:
NIO utensAsynchronousFileChannel
Praestare asynchronum limam legere et scribere;
import java.io.IOException;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.nio.channels.AsynchronousFileChannel;
import java.nio.ByteBuffer;
import java.util.concurrent.CountDownLatch;
public class AsyncNonBlockingIOExample {
public static void main(String[] args) throws IOException, InterruptedException {
AsynchronousFileChannel inChannel = AsynchronousFileChannel.open(Paths.get("input.txt"), StandardOpenOption.READ);
AsynchronousFileChannel outChannel = AsynchronousFileChannel.open(Paths.get("output.txt"), StandardOpenOption.WRITE);
ByteBuffer buffer = ByteBuffer.allocate(1024);
CountDownLatch latch = new CountDownLatch(1);
inChannel.read(buffer, 0, buffer, 0, (channel, result) -> {
buffer.flip();
outChannel.write(buffer, 0, buffer, 0, null);
latch.countDown();
});
latch.await();
inChannel.close();
outChannel.close();
}
}
Nota: asynchronous exemplar requirit auxilium a ratio operandi subiecta (Kernel)
definition In doctrina, hoc exemplar non est, quia "asynchronum" significat operationem in curriculo perfici et filum non impeditur. Ergo asynchronous interclusio I/O est conceptus contradictorius et in usu non apparebit.
Opportunum eligendum I/O exemplar est criticum ad perficiendi et subsidiorum administrationem. In missionibus summus concursus, synchrona non-obstructio I/O vel synchrona multiplicata I/O exemplaria electiones communes sunt.
Nulla-Copy conceptum
Nulla exemplum technologiae significat quod in processu transmissionis notitiarum de loco in locum, notitias inter spatium usoris et spatium nuclei non oportet exscribi, vel saltem numerum talium exemplarium minuere, eo quod efficientiam augeat. ratio. In institutis I/O operationibus, cum notitia e retis vel orbis legitur, primum ad quiddam in spatio nucleo exscriptus est, deinde a spatio nucleo ad quiddam in spatio usoris exscriptus. Contra, in nulla-exemplar, notitia directe in spatio nuclei discursum esse potest, vel ex spatio nucleo ad retis fabrica directe transferri, inde reducendo exemplum operationis CPU, systematis supra caput reducens, et efficientiam transmissionis datae emendans.
Source of nulla exemplum
Conceptus nullius exemplaris primus apparuit in consilio operandi ratio, quaerens solvere solutionem bottleneck causatum notitiarum enucleandi in operationibus traditionalibus I/O. In primis systematibus computatoriis, omnes I/O operationes multae notitiae exemplares inter spatium usoris et nuclei spatium requirebant. Hoc sensim factus est cum reticulis summus velocitatis et magnae capacitatis orbis retiaculorum perficiendi facta est.
Key technica puncta
Exsecutio in Java:
Java nulla-exemplar technologiae per compagem NIO (Novum I/O) sustinet. NIO introductusFileChannel
etSocketChannel
et alia genera, quae efficaciorem I/O operationes praebent. Speciatim,FileChannel.transferTo()
etFileChannel.transferFrom()
Methodi notitias directe a canali fasciculi ad nervum vel vice versa transferre possunt quin notitias in quiddam onerant, ita ut nullum exemplar obtineant.
Exempli gratia, argumenta fasciculi magni ad retiaculum mittere debes. Traditionalis accessio est primum tabella contenta in quiddam legere, deinde quiddam contenta in retiaculis scribere. Duas operationes exemplum hoc involvit: unum ab orbe ad quiddam, alterum a quiddam ad ornatum.dum usuratransferTo()
Cum hac methodo utens, notitia directa ab orbe ad reticulum transferri potest sine necessitate quiddam medium, quod numerum exemplarium reducit et nullum exemplum consequitur.
Exemplum per ByteBuffer:
ByteBuffer
et aliaBuffer
classis (ut *CharBuffer
,ShortBuffer
etc.) praebent buffers quae impleri vel evacuari possunt sine exemplarium inter spatium usoris et nuclei spatium involvente.ByteBuffer
Potest adhiberi directe vel indirecte in nulla technicarum exemplarium:
ByteBuffer.allocateDirect(size)
creatusByteBuffer
Instantiae directe provisae sunt memoriae physicae, praetereunte acervo Javae.Quando tale quiddam comparaturFileChannel
or *SocketChannel
Cum simul usus est, notitia recta inter physicas memoriam et machinas ferramentis transferri potest sine necessitate additi exemplarium per Iava acervum. Hoc verum dat exemplum nulla in quibusdam suggestis.FileChannel
of *transferTo()
ettransferFrom()
: Hae methodi permittunt datam directe condiFileChannel
etSocketChannel
traducitur interByteBuffer
ut medius. Id significat notitias datas directe ab orbe ad retis vel vice versa transferri posse, quin transcribendum sit inter spatium usoris et spatium nuclei.ByteBuffer
of *wrap()
methodo:wrap()
methodo concedit te involvere existentem byte ordinata vel aliud quiddam in aByteBuffer
sic nihil opus est notitias novo quiddam exscribere. Hoc est utile ad vitandum notitias supervacuas describendas.ByteBuffer
of *slice()
methodo:slice()
methodus visum gignit quiddam sine exemplarium notitia subiecta.Hoc significat magnamByteBuffer
Scinditur in multiplex minora buffers sine notitia describendi.Miscere ByteBuffer cum FileChannel:
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
public class ZeroCopyExample {
public static void main(String[] args) {
Path path = Path.of("example.txt");
try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ)) {
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
long transferred = fileChannel.transferTo(0, fileChannel.size(), System.out);
System.out.println("Transferred bytes: " + transferred);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Animadverte:
Re vera notandum, nullum exemplar nullum omnino esse. Sed etiam in gradu usoris, impossibile est nullas omnino operationes habere exemplares, sed exemplaria reducere quam maxime. et non significat operationem realem exemplar non esse.