NIO学習ノート(1)-Buffer,Channel


Bufferは、書き込みまたは読み出したばかりのデータを含むオブジェクトです.NIOにBufferオブジェクトを追加することは、新しいライブラリと元のI/Oの重要な違いを示しています.ストリーム向けI/Oでは、Streamオブジェクトに直接データを書き込むか、直接データを読み込みます.
 
NIOライブラリでは、すべてのデータがバッファで処理されます.データを読み込むと、バッファに直接読み込まれます.データの書き込み時にバッファに書き込まれます.NIOのデータにアクセスするときは、バッファに配置します.
 
Channelは、データの読み取りと書き込みを行うオブジェクトです.NIOを元のI/Oと比較すると、通路は流れのようです.
 
前述したように、すべてのデータはBufferオブジェクトによって処理されます.チャネルにバイトを直接書き込むことはありません.逆に、1バイト以上のバッファにデータを書き込むことです.同様に、チャネルからバイトを直接読み込むのではなく、チャネルからバッファにデータを読み込み、バッファからバイトを取得します.
 
 flip:
 
出力チャネルにデータを書きます.その前にflip()メソッドを呼び出さなければなりません.この方法は2つの非常に重要なことをします.
 
limitを現在のpositionに設定します.
positionを0に設定します.
 
コピーファイルの一例

  
  
  
  
  1. public static void copy() throws IOException 
  2.     { 
  3.         FileInputStream fin = new FileInputStream("e:/main.rar"); 
  4.         FileChannel finc = fin.getChannel(); 
  5.         ByteBuffer buf = ByteBuffer.allocate(8); 
  6.          
  7.         FileOutputStream fout = new FileOutputStream("e:/back.rar"); 
  8.         FileChannel foutc = fout.getChannel(); 
  9.         int readNum = 0
  10.          
  11.         buf.clear(); 
  12.      
  13.         while(readNum != -1){// -1 
  14.             readNum = finc.read(buf); 
  15.             buf.flip();// 0。 buffer , buffer ( ) 。 
  16.             foutc.write(buf); 
  17.             buf.clear(); 
  18.         } 
  19.  
  20.         finc.close(); 
  21.         fin.close(); 
  22.         fout.close(); 
  23.         foutc.close(); 
  24.     } 

 
分散/集約I/Oは、単一バッファではなく複数のバッファを使用してデータを保存する読み書き方法です.
 
チャネルは、ScatteringByteChannelとGatheringByteChannelの2つの新しいインタフェースを選択的に実装することができる.ScatteringByteChannelは、2つの追加の読み取り方法を有するチャネルです.
long read( ByteBuffer[] dsts );
long read( ByteBuffer[] dsts, int offset, int length );
たとえば
fin.getChannel().read(dsts);
分散読み取りでは、チャネルは各バッファに順次埋め込まれます.バッファを満たすと、次のバッファを埋め始めます.ある意味では、バッファ配列は大きなバッファのようなものです.
分散/集約の適用
分散/集約I/Oは、データをいくつかの部分に分割するのに役立ちます.たとえば、メッセージオブジェクトを使用するネットワークアプリケーションを作成し、各メッセージを固定長のヘッダと固定長の本文に分割することができます.ヘッダを収容できるバッファと、テキストを収容できるバッファを作成できます.1つの配列に配置し、分散読み出しを使用してメッセージを読み込むと、ヘッダと本文が2つのバッファに整列します.
バッファから得られた利便性はバッファ配列に対しても同様に有効である.各バッファは、自分がどれだけのデータを受け入れることができるかを追跡するため、分散読み出しは、データを受け入れるスペースのある最初のバッファを自動的に見つけます.このバッファが満たされると、次のバッファに移動します.
 
集約書き込みは分散読み取りと同様で、書き込みにのみ使用されます.バッファ配列を受け入れる方法もあります.
long write( ByteBuffer[] srcs );
long write( ByteBuffer[] srcs, int offset, int length );
集約ライトは、個別のバッファのセットから単一のデータストリームを構成するのに役立ちます.上記のメッセージ・インスタンスと一貫性を保つために、集約書き込みを使用して、ネットワーク・メッセージの各部分を自動的に単一のデータ・ストリームにアセンブリし、ネットワークを越えてメッセージを転送できます.