NIO入門シリーズの第2章:チャネルとバッファ
第2章チャネルとバッファ
2.1概要
チャネルとバッファはNIOのコアオブジェクトであり、ほとんどのI/O操作で使用されます.
チャネルは、元のI/Oパケット内のストリームのシミュレーションです.任意の宛先(または任意の場所から)へのすべてのデータは、チャネルオブジェクトを通過する必要があります.Bufferは実質的にコンテナオブジェクトです.1つのチャネルに送信されるすべてのオブジェクトは、まずバッファに配置する必要があります.同様に、チャネルから読み出されたデータは、バッファに読み出される.
2.2バッファとは?
Bufferは、書き込みまたは読み出したばかりのデータを含むオブジェクトです.NIOにBufferオブジェクトを追加することは、新しいライブラリと元のI/Oの重要な違いを示しています.ストリーム向けI/Oでは、Streamオブジェクトに直接データを書き込むか、直接データを読み込みます.
NIOライブラリでは、すべてのデータがバッファで処理されます.データを読み込むと、バッファに直接読み込まれます.データの書き込み時にバッファに書き込まれます.NIOのデータにアクセスするときは、バッファに配置します.
バッファは実質的に配列である.通常はバイト配列ですが、他の種類の配列も使用できます.しかし、1つのバッファは配列だけではありません.バッファは、データへの構造的なアクセスを提供し、システムの読み取り/書き込みプロセスを追跡することもできます.
2.3バッファタイプ
最も一般的なバッファタイプはByteBufferです.1つのByteBufferは、最下位のバイト配列上でget/set操作(バイトの取得と設定)を行うことができます.
ByteBufferはNIOで唯一のバッファタイプではありません.実際には、基本的なJavaタイプごとにバッファタイプがあります.
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
各Bufferクラスは、Bufferインタフェースのインスタンスです.ByteBufferを除いて、各Bufferクラスにはまったく同じ操作がありますが、処理されるデータ型は異なります.ほとんどの標準I/OオペレーションではByteBufferが使用されるため、すべての共有バッファオペレーションといくつかの特有のオペレーションがあります.
UseFloatBufferを実行するのに少し時間がかかります.JAvaは、タイプ化されたバッファの適用例を含む.import java.nio.*;
public class UseFloatBuffer
{
static public void main( String args[] ) throws Exception {
FloatBuffer buffer = FloatBuffer.allocate( 10 );
for (int i=0; i<buffer.capacity(); ++i) {
float f = (float)Math.sin( (((float)i)/10)*(2*Math.PI) );
buffer.put( f );
}
buffer.flip();
while (buffer.hasRemaining()) {
float f = buffer.get();
System.out.println( f );
}
}
}
2.4チャネルとは?
Channelは、データの読み取りと書き込みを行うオブジェクトです.NIOを元のI/Oと比較すると、通路は流れのようです.
前述したように、すべてのデータはBufferオブジェクトによって処理されます.チャネルにバイトを直接書き込むことはありません.逆に、1バイト以上のバッファにデータを書き込むことです.同様に、チャネルからバイトを直接読み込むのではなく、チャネルからバッファにデータを読み込み、バッファからバイトを取得します.
2.5チャネルタイプ
チャネルとストリームの違いは、チャネルが双方向であることです.一方、ストリームは一方向に移動するだけであり(ストリームはInputStreamまたはOutputStreamのサブクラスでなければならない)、チャネルは読み取り、書き込み、または読み取り、書き込みの両方に使用することができる.
これらは双方向であるため、チャネルはストリームよりも下位オペレーティングシステムの実際の状況をよりよく反映することができる.特にUNIXモデルでは,下位オペレーティングシステムチャネルは双方向である.
import java.nio.*;
public class UseFloatBuffer
{
static public void main( String args[] ) throws Exception {
FloatBuffer buffer = FloatBuffer.allocate( 10 );
for (int i=0; i<buffer.capacity(); ++i) {
float f = (float)Math.sin( (((float)i)/10)*(2*Math.PI) );
buffer.put( f );
}
buffer.flip();
while (buffer.hasRemaining()) {
float f = buffer.get();
System.out.println( f );
}
}
}