インターネット技術の急速な発展に伴い、さまざまな大規模アプリケーション システムの需要が増加し続けており、効率的な IO 運用の必要性がますます高まっています。一般的に使用されるプログラミング言語として、Java は IO 操作で使用されることが増えています。また、効率的なIO動作の実現方法としてNIO機能も近年注目を集めています。この記事では、Java で NIO 関数を使用して効率的な IO 操作を実行する方法を紹介します。
1. NIO の概要
NIO (New I/O) は、Java 1.4 バージョンで導入された新しい IO API であり、従来の IO API と比較して、NIO はノンブロッキングです。 。従来の IO API はストリーム指向であるのに対し、NIO はブロック指向です。ストリーミング IO の欠点は、大きなファイルの読み取りおよび書き込みが必要な場合、読み取りおよび書き込み IO ブロックの問題が多数発生し、プログラムの効率に重大な影響を与えることです。ブロック IO は、データ ブロックの読み取りおよび書き込み時の不要な IO ブロックを回避し、IO 動作効率を向上させることができます。同時に、NIO は効率的な多重化 (Multiplexing) メカニズムも提供します。これにより、複数の IO イベントを同時に監視し、ネットワーク通信の効率を向上させることができます。
2. NIO の使用法
NIO の Buffer クラスはコア クラスの 1 つであり、その機能はキャッシュです。データの読み取りと書き込み。従来の IO API とは異なり、NIO のバッファにはデータの読み取りと書き込みに関する特定のルールがあります。たとえば、データを書き込む前に、Buffer.flip() メソッドを呼び出して、読み取り操作用のバッファの書き込みポインタをリセットする必要があります。 Buffer クラスには、position()、limit()、capacity() など、必要に応じて使用できる他の多くのメソッドがあります。さらに、NIO には、ByteBuffer、CharBuffer、IntBuffer など、さまざまなタイプのデータをキャッシュするために使用されるさまざまな Buffer クラスがあります。
Buffer クラスに加えて、Channel クラスも NIO のコア クラスの 1 つであり、その機能は読み取りと書き込みです。データ。 NIO の Channel クラスには、FileChannel、DatagramChannel などのさまざまなタイプのチャネルが含まれています。従来の IO API とは異なり、NIO の Channel クラスはノンブロッキング IO 操作を実行できます。
NIO の Selector クラスは、NIO で多重化を実装するための重要なクラスです。 Selector クラスは複数のチャネルを監視でき、1 つ以上のチャネルに読み取りまたは書き込み可能なデータがある場合、Selector は対応するチャネルに読み取りおよび書き込み操作を実行するように通知します。 Selector クラスを使用すると、複数のチャネルを読み書きするための複数のスレッドの作成を回避できるため、プログラムの効率が向上します。
3. NIO の例
以下では、例を使用して NIO の使用法を説明します。ファイルがあり、そのファイル内のデータを 1 行ずつ読み取り、コンソールに出力する必要があるとします。
FileChannel は、次のメソッドを通じてファイル コンテンツを読み取ることができます:
public static void readFile(String fileName) throws IOException{ FileInputStream fis = new FileInputStream(fileName); FileChannel fc = fis.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); while(fc.read(buffer) != -1){ buffer.flip(); while(buffer.hasRemaining()){ System.out.print((char)buffer.get()); } buffer.clear(); } fc.close(); fis.close(); }
コードでは、ファイル チャネル FileChannel は最初に次の方法で取得されます。 FileInputStream、次に ByteBuffer バッファを作成し、バッファ サイズを 1024 バイトとして指定します。ファイルを読み取る場合は、fc.read(buffer) メソッドでファイルを読み取り、読み取りが完了したかどうかを判断します。読み取りが完了していない場合は、buffer.flip() メソッドを呼び出して、バッファの位置と制限をリセットします。各ループがバッファー内のデータを読み取った後、バッファーを再利用できるように、バッファーの位置を 0 に設定し、バッファーの容量の制限を設定する必要があります。
LineIterator クラスを使用して、行ごとの読み取りを実装できます。
public static void readLine(String fileName) throws IOException{ FileInputStream fis = new FileInputStream(fileName); FileChannel fc = fis.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); Charset charset = Charset.forName("UTF-8"); LineIterator iterator = new LineIterator(charset.newDecoder()); while(fc.read(buffer) != -1){ buffer.flip(); iterator.read(buffer, new LineHandler() { @Override public boolean handle(String line) throws Exception { System.out.println(line); return true; } @Override public void endOfFile() throws Exception { System.out.println("End of File."); } }); buffer.compact(); } iterator.finish(); fc.close(); fis.close(); }
コード内、まず LineIterator オブジェクトを作成し、指定された文字セット エンコーディングは UTF-8 です。ファイルの内容を読み取るときは、 iterator.read(buffer,LineHandler) メソッドを通じてファイルの内容を 1 行ずつ読み取ります。 LineHandler インターフェイスの handle(String line) メソッドは、読み取られたデータの行を処理するために使用され、endOfFile() メソッドは、ファイルの読み取りが終了したときの状況を処理するために使用されます。 handle メソッドでは、読み取った 1 行のデータをコンソールに出力するなどの処理を行うことができます。
Selector クラスを使用して多重化操作を実装できます。次は簡単な例です。コード A Selector を使用して、ポート 9999 での接続をリッスンするための ServerSocketChannel チャネルを登録します。 while ループでは、セレクターの select() メソッドを通じて IO イベントを監視します。チャネルによって登録された 1 つ以上の IO イベントがトリガーされると、セレクターは対応する SelectionKey を返します。 SelectionKey.isAcceptable() メソッドを使用して、SelectionKey のタイプを決定し、SocketChannel の OP_READ 操作の登録などの操作を実行できます。
4. 概要
この記事では、Java で NIO 関数を使用して効率的な IO 操作を実行する方法を紹介します。 NIO メカニズムを導入することで、従来の IO のブロッキング問題を回避し、プログラムの効率を向上させることができます。 NIO のコア クラスには、バッファー、チャネル、セレクターなどが含まれており、これらを介してさまざまな効率的な IO 操作を完了できます。実際のアプリケーションでは、最良の結果を得るために、特定のビジネス ニーズとシナリオに従って NIO 関数の使用形式と方法を決定する必要があります。
以上がJava で効率的な IO 操作を行うために NIO 関数を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。