NIO は、IO 操作の欠点を補うために生まれました。NIO の新機能には、ノンブロッキング I/O、セレクター、バッファー、パイプなどがあります。チャンネル、バッファ、セレクターが主な機能です。
概念の説明:
Channel - パイプは実際には従来の IO におけるストリームのようなもので、宛先 (またはどこからでも) へのすべてのデータは Channel オブジェクトを通過する必要があります。バッファーは本質的にコンテナ オブジェクトです。
セレクター — セレクターは、複数のパイプのイベントをリッスンするために使用されます。従来のブロッキング IO を使用する場合、読み取りと書き込みがいつ実行できるかを簡単に知ることができます。ただし、非ブロッキング チャネルを使用する場合は、それを知るためのいくつかのメソッドが必要です。はい、セレクターはこのニーズのために生まれました。
NIO と従来の IO の違いは何ですか?
1. IO はストリーム指向であり、NIO はブロック (バッファー) 指向です。
IO ストリーム指向の操作は、データを一度に 1 バイトずつ処理します。入力ストリームは 1 バイトのデータを生成し、出力ストリームは 1 バイトのデータを消費します。
NIO ブロック指向の操作では、1 ステップでデータ ブロックが生成または消費されます。データをチャンク単位で処理することは、(ストリーミング) バイト単位でデータを処理するよりもはるかに高速ですが、データは後で処理されるバッファーに読み取られ、必要に応じてバッファー内を前後に移動できます。これにより、処理の柔軟性が向上します。平たく言えば、NIO は「先読み」方式を採用しており、データの特定の部分を読み取るときに、次に読み込む可能性のあるデータを推測し、事前にバッファリングします。
2. IO はブロッキングであり、NIO はノンブロッキングです。
従来の IO の場合、スレッドが read() または write() を呼び出すと、一部のデータが読み取られるか、データが完全に書き込まれるまで、スレッドはブロックされます。この期間中、スレッドは他のことを行うことはできません。
NIO の場合、スレッドは、応答を取得する前に、IO のように応答が完了するのを待つのではなく、アイドル状態になります。 。
NIO と IO の適用可能なシナリオ
NIO は従来の IO の欠点を補うために生まれましたが、NIO はバッファー指向の操作であり、すべてのデータ処理が複雑であるため、いくつかの欠点といくつかの利点があります。バッファ上で実行される場合、データ処理の前に、バッファ内のデータが完全に読み取られているかどうかを判断する必要があります。そうでない場合は、データの一部だけが読み取られていると仮定します。不完全なデータ処理は意味がありません。したがって、各データ処理の前にバッファ データを検出する必要があります。
それでは、NIO と IO に適用できるシナリオは何でしょうか?
チャット サーバーなど、同時に開かれる数千の接続を管理する必要があり、これらの接続が毎回少量のデータしか送信しない場合は、NIO を使用してデータを処理するのが良い選択になる可能性があります。
接続の数が少なく、これらの接続が毎回大量のデータを送信する必要がある場合は、従来の IO の方が適しています。どの方法でデータを処理するかは、データの応答待ち時間やバッファデータの確認時間などを考慮して決定する必要があります。
一般的な説明
最後に、NIO と従来の IO について、ネチズンが言及した鮮やかな例があります。
前のストリームは常にブロックされていました。スレッドがそのストリーム上で動作している限り、他の動作はブロックされます。水を受け取ろうと手を伸ばすと、水が来るか来ないかに関わらず、水(流れ)を受け取ることだけに時間を費やすことができるのと同じです。
nio のチャンネルの追加は、蛇口 (バルブ付き) を追加するのと同じですが、一度に 1 つの水道管からのみ水を受け取ることができますが、水量が多くない場合は、水の回転戦略に依存します。重要な点は、水道管に水がある場合、水の流れを調整する役割を担う水コレクターを追加することです。水道管がある程度つながったら、切り替えて、現在の蛇口を一旦閉じて、別の蛇口を開けてみます(水があるかどうかを確認します)。
他の人が水が必要なとき、直接水を汲みに行くのではなく、事前に水汲み場にバケツを渡します。このバケツがバッファーです。つまり、他の人は待たなければならないかもしれませんが、代わりに家に帰って他のことをして待つことができます。
これは実際、現在の社会的分業の現実に非常に近いものですが、それが最も単純ではありますが、並行処理を行うのではなく、既存のリソースを使用して同時効果を達成することもできます。しかし、それは
リソースの最も無駄な方法でもあります。
以上がNIO と Java の IO の違いと適用可能なシナリオの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。