ホームページ >Java >&#&チュートリアル >Java NIO チュートリアル
NIO は New I/O の略称であり、その真の意味を理解するには、多くの知識を習得する必要があります。私はこれらのメモで io 全体の概要を説明しようと懸命に努力しました。全員の深い学びへの道を切り開きます。
I/O の簡単な歴史
すべての I/O を理解したい場合は、Java の I/O 履歴を理解する必要があります。 Java の I/O 履歴は、ある面では Java の開発の歴史を反映しています。
JDK1.0-1.3
この時期の Java では、基本的に完全な I/O サポートは存在しないと言えます。この期間中の Java I/O 操作はブロックされるため、I/O 効率は比較的低くなります。より優れた I/O ソリューションを実現するには、基本的に自分自身に頼る必要があります。この期間中、Java はサーバー側で再利用されていませんでした。これは I/O 効率の低下に大きく関係しています。 I/Oだけでなく、周辺の一連の対策も不十分だった。サポートされている文字セット エンコーディングは限られており、多くの場合、手動のエンコーディング作業が必要になります。また、正規表現がないと、データを処理するのが非常に困難になります。
JDK1.4-1.6
2002年にリリースされたjava1.4では、ノンブロッキングI/OがJSR-51としてJava言語に追加されました。同時に、文字セットのエンコードおよびデコード機能が大幅に向上しました。 Perl ベースの正規表現クラス ライブラリもあります。同時に、古い I/O の基盤となる実装の一部も新しい I/O メソッドを使用して書き直され、古い I/O のパフォーマンスが向上しました。ついにサーバーサイドでもJavaが普及しました。
同時に、サードパーティも力を入れ始めています。 Google は、Guava クラス ライブラリをリリースしました。このライブラリの I/O 部分は、一部のファイル操作とデータ送信を大幅に簡素化します。同時に、Trustin Lee のリーダーシップの下で書かれた nio フレームワーク netty と mina も広く流通し、java nio の開発を大きく促進しました。
JDK1.7 から現在まで
JSR-203 のリリースにより、Java1.7 に NIO2 が登場しました。これは、ノンブロッキングのより強力な非同期 I/O 操作機能を提供し、ファイル システムとファイル属性を操作するための非常に便利な一連の API も提供します。さらに強力なネットワーク I/O
I/O の違い
ブロッキング I/O、ノンブロッキング I/O、非同期 I/O の違いは何ですか?あらゆる進歩が Java I/O 機能の大幅な向上につながるのはなぜでしょうか?野菜栽培ゲームの例を見てみましょう。
野菜栽培ゲームがあるとします (以前の QQ ファームと同様) プレーヤーは野菜を植えた後、その Web ページに留まり、野菜が収穫できるようになるまで観察する必要があります。これは非常に時間の無駄であり、ユーザー エクスペリエンスは間違いなく良くありません。このゲームは後に修正され、野菜を植えた後にその Web ページに留まる必要はなくなり、定期的に確認するだけで、野菜が成長していることがわかりました。 。もちろん、ユーザーエクスペリエンスは大幅に向上し、ユーザーの無駄な時間も削減されましたが、ユーザーエクスペリエンスをさらに向上させるために、ゲームが改訂されました。プレーヤーが野菜を植えた後、野菜が熟しているかどうかを確認する必要はなくなります。野菜が熟すと、ゲームは自動的にユーザーに通知を送信し、野菜が熟しているため、すぐに収穫する必要があることを伝えます。 。このようにして、ユーザーは基本的に時間を無駄にする必要がなくなります。
例の 3 つのゲーム バージョンは、3 種類の I/O を表しているだけです。ブロッキング I/O: データの読み取りと書き込みが完了するまで CPU は次の操作に進むことができないため、CPU はそこで待機するしかありません。ノンブロッキング I/O: CPU は、データの読み取りまたは書き込みが行われる前に終了することができ、時々要求するだけで済みます。非同期 I/O: データの読み取りと書き込みが行われる前に、CPU は時々 I/O を気にすることなく終了でき、データの読み取りと書き込みが行われると、CPU にアクティブに通知されます。 3 種類の I/O 間の効率はレベルによって異なります。
新しい I/O
java1.4 によって提案されたノンブロッキング I/O を出発点として、全体像を理解し始めましょう。
チャンネル
バッファ
セレクター
これら 3 つのクラスは、ノンブロッキング I/O のコア API を構成します。
バッファはバッファ領域と訳され、データを保存できるメモリの一部です。チャネルはストリームに似ていますが、ローカル I/O からネットワーク I/O まで、読み取りと書き込みが可能です。ほとんどの NIO は、チャネルからバッファにデータを読み込んだり、バッファに書き込んだりできます。 .チャンネルへ。
ノンブロッキング I/O では、CPU はデータの読み取りまたは書き込みが行われる前に終了することができ、時々要求するだけで済みます。データの読み取りと書き込みを確認するには最小限の CPU パワーが必要ですが、CPU が頻繁にタスクを切り替えると、シーンの保持と復元に必要な時間が長くなります。したがって、スレッドを使用してデータの準備ができているかどうかを確認するだけです。スレッドが複数のチャネルでデータの準備ができているかどうかを尋ねる場合、複数のチャネルを管理する必要があります。これは
Selector を使用するには、Selector に Channel を登録し、その select() メソッドを呼び出す必要があります。このメソッドは、登録されたチャネルでイベントの準備ができるまでブロックされます。このメソッドが返されると、スレッドはこれらのイベントを処理できるようになります。