JAVA IO パッケージと NIO

目次

ジャワニオ

NIOバッファ

NIO ノンブロッキング

チャネル

バッファ

セレクタ


 

ジャワニオ

NIO には主に、チャネル、バッファ、セレクターの 3 つのコア部分があります。従来の IO はバイト ストリームとワードに基づいています
ストリーム上で動作する のに対し、NIO はチャネルとバッファ (バッファ) に基づいて動作し、データは常にチャネルからバッファに読み込まれます。
に、またはバッファからチャネルに書き込まれます セレクター (選択領域) は、複数のチャネルのイベントを監視するために使用されます (例: 接続の開始、
データが到着します)。したがって、単一のスレッドは複数のデータ チャネルをリッスンできます。
NIO と従来の IO の最初の最大の違いは、 IO がストリーム指向であるのに対し、NIO はバッファ指向であることです。

 

NIOバッファ

Java IO はストリーム指向であり、一度に 1 つ以上のバイトがストリームから読み取られ、すべてのバイトが読み取られるまで、どのバイトにもキャッシュされません。
場所。さらに、ストリーム内のデータを前後に移動することはできません。ストリームから読み取ったデータを前後に移動する必要がある場合は、最初にそれをバッファリングする必要があります
バッファに保存します。NIO のバッファー指向のアプローチは異なります。データはバッファに読み取られ、必要に応じて後で処理されます。
バッファ内を前後に移動します。これにより、処理の柔軟性が向上します。ただし、バッファにすべてのデータが含まれているかどうかも確認する必要があります。
処理する必要があるデータがあります。また、さらに多くのデータがバッファに読み込まれるときに、バッファ内の未処理のデータが上書きされないように注意してください。
データ。
 

NIO ノンブロッキング

さまざまな IO ストリームがブロックされます。これは、スレッドが read() または write() を呼び出すと、スレッドがブロックされるまでブロックされることを意味します。
一部のデータが読み取られたか、データが完全に書き込まれました。この期間中、スレッドは他のことを行うことはできません。NIO のノンブロッキング モード、
スレッドがチャネルからデータを読み取るリクエストを送信しますが、取得できるのは現在利用可能なデータのみです。現在利用可能なデータがない場合は、
使っても何も得られません。スレッドをブロックしたままにするのではなく、データが読み取り可能になるまで、スレッドは
他のことに移りましょう。ノンブロッキング書き込みについても同様です。スレッドはチャネルへのデータの書き込みを要求しますが、それを待つ必要はありません
完全に書かれたこのスレッドは、他のことを同時に行うことができます。スレッドは通常、ノンブロッキング IO のアイドル時間を使用して、他のチャネルで他のタスクを実行します。
IO 操作を実行することで、単一のスレッドが複数の入出力チャネルを管理できるようになります。

チャネル

まずチャンネルについて話しましょう。チャンネルは中国では主に「チャンネル」と訳されます。IOのChannelとStreamはほぼ同じ
階層的な。 Stream が一方向であるというだけです 。たとえば、InputStream、OutputStream、 Channel は双方向です。
読み取り操作と書き込み操作の両方に使用できます。
NIO のチャネルの主な実装は次のとおりです。
1. ファイルチャネル
2. データグラムチャネル
3. ソケットチャネル
4. サーバーソケットチャネル
ここでの名前を見てその理由を推測することができます。これらはそれぞれファイル IO、UDP、TCP (サーバーとクライアント) に対応している可能性があります。
以下に示すケースは、基本的にこれら 4 種類のチャネルを中心に展開します。

バッファ

名前の由来となっているバッファーは、 実際にはコンテナーであり、連続配列です チャネルはファイルからのアクセスを提供します。
ネットワークはデータを読み取るためのチャネルですが、読み書きされるデータはバッファを経由する必要があります。

上の図は、クライアントからサーバーにデータを送信し、サーバーがデータを受信するプロセスを示しています。クライアントが送信する
データを読み取るときは、まずデータをバッファに保存する必要があり、次にバッファ内の内容がチャネルに書き込まれます。サーバーはここでデータを受信する必要があります
データはチャネル経由でバッファに読み込まれ、その後処理のためにバッファから取り出される必要があります。
NIO では、Buffer は抽象クラスである最上位の親クラスであり、一般的に使用される Buffer のサブクラスは次のとおりです。
ByteBuffer、IntBuffer、CharBuffer、LongBuffer、DoubleBuffer、FloatBuffer、
ショートバッファ

セレクタ

Selector クラスは NIO のコア クラスであり、 登録された複数のチャネルでイベントが発生したかどうかを検出できます。
イベントが発生すると、そのイベントを取得し、イベントごとに対応する応答処理を行います このように、単一のスレッドを使用するだけで、
複数のチャネルを管理する、つまり複数の接続を管理する。これは、接続上で実際に読み取りおよび書き込みイベントが発生した場合にのみ呼び出されます。
関数は読み取りと書き込みに使用されるため、システムのオーバーヘッドが大幅に削減され、接続ごとにスレッドを作成したり、スレッドを維持したりする必要がありません。
複数のスレッドを使用し、複数のスレッド間のコンテキストの切り替えによって発生するオーバーヘッドを回避します。

 

Supongo que te gusta

Origin blog.csdn.net/weixin_38340874/article/details/122087795
Recomendado
Clasificación