注: Concurrent Programming Network – ifeve.com から転載この記事のリンク アドレス:Java NIO チュートリアル シリーズ (2) Channel
Java NIO チャネルはストリームに似ていますが、多少異なります:
チャネルからデータを読み取ることも、チャネルにデータを書き込むこともできます。ただし、ストリームの読み取りと書き込みは通常一方向です。
チャネルは非同期で読み書きできます。
チャネル内のデータは、常に最初にバッファから読み取るか、常にバッファから書き込む必要があります。
上で述べたように、データはチャネルからバッファに読み取られ、データはバッファからチャネルに書き込まれます。以下の図に示すように:
これらは Java NIO の最も重要なチャネルの実装です:
FileChannel
DatagramChannel
ソケットチャンネル
ServerSocketChannel
FileChannel は、ファイルからデータを読み書きします。
DatagramChannel は、UDP を介してネットワーク内のデータを読み書きできます。
SocketChannel は、TCP 経由でネットワーク内のデータを読み書きできます。
ServerSocketChannel は、Web サーバーと同様に、新しい受信 TCP 接続を監視できます。 SocketChannel は、新しい受信接続ごとに作成されます。
以下は、FileChannel を使用してデータをバッファに読み取る例です:
public class Channel1 {public static void main(String[] args) {try { RandomAccessFile raf = new RandomAccessFile("./.gitignore","rw"); FileChannel channel = raf.getChannel(); //获取通道ByteBuffer bf = ByteBuffer.allocate(50); //通过静态allocate方法创建一个缓冲区,容量为50byte[] bytes = new byte[]{}; bytes = "123".getBytes(); bf = ByteBuffer.wrap(bytes); //通过静态wrap方法,byte数组生成缓冲区,缓冲区中保留了原数据while(bf.hasRemaining()){ System.out.print((char) bf.get()); }int bytesRead ;while ((bytesRead = channel.read(bf)) != -1) { //将通道中的数据写入缓冲区,并判断通道中的数据是否到末尾System.out.println("Read " + bytesRead);bf.flip(); //反转缓冲区 实际上就是将position置为0 后续buffer详细介绍while(bf.hasRemaining()){ //判断缓冲区中是否还有值System.out.print((char) bf.get()); //输出缓冲区中的值 } bf.clear(); //清理缓冲区 } raf.close(); //关闭RandomAccessFile} catch (IOException e) { e.printStackTrace(); } } }
buf.flip() の呼び出しに注意してください、最初にデータを読み取りますBuffer にデータを読み込み、次に Buffer を反転して、Buffer からデータを読み取ります。次のセクションでは、Buffer について詳しく説明します
以上がJAVAのチャンネルの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。