Java NIO入門ガイド
2284 ワード
前言
このブログでは、NIOの原理実装と基本的なワークフローについて簡単に説明します.
I/OとNIOの本質的な違い
NIOはバッファの充填と抽出のI/O動作をオペレーティングシステムに移行した
I/Oはストリームでデータを処理し、NIOはバッファでデータを処理する.IOはブロックされ、NIOは非ブロックされ、データが読み込まれたり、データが完全に書き込まれたりするまで、IOスレッドは動作を開始しますが、NIOはどのような状況でも非ブロックです.
チャネルとバッファ
NIOの3つのコアオブジェクト:チャネル(Channel)、バッファ(Buffer)、セレクタ(Selector)
バッファはデータのみを一時的に格納し、チャネルは読み取りと書き込み操作に用いられ、IOストリームに相当し、IOストリームとは異なりチャネルは双方向である.
NIO動作では,チャネルから読み出されたデータはバッファに先に置かなければならず,チャネルに送られたデータもバッファに先に置かなければならない.
NIOチャネル
≪チャネル|Channel|emdw≫:チャネルはオブジェクトであり、データの読み取りと書き込みが可能であり、元のI/Oパケット内のストリームのシミュレーションと理解できます.
チャネルとストリームの違いは、チャネルが双方向であることです.チャネルは、読み書き、または同時に読み書きに使用できますが、ストリームは1つの方向しかありません.すなわち、1つのストリームはInputStreamのサブクラスまたはOutputStreamのサブクラスでなければなりません. FileChannel:ファイルからデータを読み書きします. DatagramChannel:UDPでネットワーク内のデータを読み書きできます. SocketChannel:TCPを通じてネットの中のデータを読み書きすることができます. ServerSocketChannel:Webサーバのように、新しく入ってきたTCP接続を傍受できます.新しい接続ごとにSocke Channelが作成されます.
NIOバッファ
≪バッファ|Buffer|emdw≫:バッファは実質的に配列です.最も一般的なバッファタイプはByteBufferで、Javaの基本タイプに対応するバッファがあります.
バッファタイプ: ByteBuffer CharBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer
NIOセレクタ
セレクタ(Selector):セレクタは、複数のチャネルのイベントをリスニングするために使用されます.Selectorでは、単一スレッドで複数のチャネルを処理できます.すなわち,複数のチャネルを登録し,同じセレクタを用いて1つのスレッドを開くだけで実行できる.
NIO読み書き操作
NIO読み出しプロセス:まずバッファを作成し、チャネル読み出しデータをこのバッファに配置します.
NIO書き込みプロセス:まずバッファを作成し、データが格納されている場合は、これらのデータをパイプに送って書き込みを行います
ファイル読み込み操作ファイル読み込みプロセス:FileInputStreamからChannelを取得し、Bufferを作成し、ChannelからBufferにデータを読み込む
ファイル書き込みプロセス
付録:NIO入門NIOシリーズチュートリアル
このブログでは、NIOの原理実装と基本的なワークフローについて簡単に説明します.
I/OとNIOの本質的な違い
NIOはバッファの充填と抽出のI/O動作をオペレーティングシステムに移行した
I/Oはストリームでデータを処理し、NIOはバッファでデータを処理する.IOはブロックされ、NIOは非ブロックされ、データが読み込まれたり、データが完全に書き込まれたりするまで、IOスレッドは動作を開始しますが、NIOはどのような状況でも非ブロックです.
チャネルとバッファ
NIOの3つのコアオブジェクト:チャネル(Channel)、バッファ(Buffer)、セレクタ(Selector)
バッファはデータのみを一時的に格納し、チャネルは読み取りと書き込み操作に用いられ、IOストリームに相当し、IOストリームとは異なりチャネルは双方向である.
NIO動作では,チャネルから読み出されたデータはバッファに先に置かなければならず,チャネルに送られたデータもバッファに先に置かなければならない.
NIOチャネル
≪チャネル|Channel|emdw≫:チャネルはオブジェクトであり、データの読み取りと書き込みが可能であり、元のI/Oパケット内のストリームのシミュレーションと理解できます.
チャネルとストリームの違いは、チャネルが双方向であることです.チャネルは、読み書き、または同時に読み書きに使用できますが、ストリームは1つの方向しかありません.すなわち、1つのストリームはInputStreamのサブクラスまたはOutputStreamのサブクラスでなければなりません.
NIOバッファ
≪バッファ|Buffer|emdw≫:バッファは実質的に配列です.最も一般的なバッファタイプはByteBufferで、Javaの基本タイプに対応するバッファがあります.
バッファタイプ:
NIOセレクタ
セレクタ(Selector):セレクタは、複数のチャネルのイベントをリスニングするために使用されます.Selectorでは、単一スレッドで複数のチャネルを処理できます.すなわち,複数のチャネルを登録し,同じセレクタを用いて1つのスレッドを開くだけで実行できる.
NIO読み書き操作
NIO読み出しプロセス:まずバッファを作成し、チャネル読み出しデータをこのバッファに配置します.
graph LR
Channel-->Buffer
NIO書き込みプロセス:まずバッファを作成し、データが格納されている場合は、これらのデータをパイプに送って書き込みを行います
graph LR
Buffer-->Channel
ファイル読み込み操作ファイル読み込みプロセス:FileInputStreamからChannelを取得し、Bufferを作成し、ChannelからBufferにデータを読み込む
// FileInputStream
FileInputStream fis = new FileInputStream( "readandshow.txt" );
FileChannel fc = fis.getChannel();
//
ByteBuffer buffer = ByteBuffer.allocate( 1024 );
//
fc.read( buffer );
ファイル書き込みプロセス
FileOutputStream fout=new FileOutputStream("write.txt");
FileChannel fc=fout.getChannel();
ByteBuffer buffer=ByteBuffer.allocate(1024);
for (int i=0; i
付録:NIO入門NIOシリーズチュートリアル