NIO入門学習(一)
2197 ワード
1.IOはバイトストリームと文字ストリームに基づいてデータ伝達を行い、NIOはチャネルとバッファに基づいて実現する.
NIOコアコンポーネント1.Chanel 2.Buffer 3.Selector(セレクタ)
Chanel 1.チャネルからデータを読み込むことも、チャネルにデータを書き込むこともできます.しかし、ストリームの読み書きは通常一方向である.2.チャネルは非同期で読み書きすることができる.3.チャネル内のデータは、常に1つのBufferに読み出されるか、または常に1つのBufferから書き込まれる.よく使われるChanel:FileChannelファイルからデータを読み書きします.
DatagramChannelは、UDPを介してネットワーク内のデータを読み書きすることができます.
SocketChannelは、TCPを介してネットワーク内のデータを読み書きすることができる.
ServerSocketChannelは、Webサーバのように、新しく入ってきたTCP接続を傍受することができます.新しい接続ごとにSocketChannelが作成されます.
Buffer Buffer三大コア:position,limit,capacity.positionは読み書きの位置を表す.limitは、書き込むデータの大きさを表す.CapacityはこのBufferの容量を表す.positionはデータの読み書きに従って下に移動し、最初は0、最大はcapacity-1である.Limitは書くときはcapacityに等しく、読むときは書き込むデータの最大値(capacityに等しくないがcapacity以下である)である.bufferは100メートルの道で、私たちがこの100メートルの中で歩いている歩数はpositionで、私たちが何メートル歩いたかはlimitです(データを読むことに限られています.サイズが知られているからです.).BufferのAPIflip():反転という意味で、チャネルからバッファに物を書くこともできるし、バッファからデータを読み取ることもできる.このメソッドを呼び出すと読み書きが反転する.clear():データを読み出した後、このメソッドを呼び出すとバッファ内のデータが空になりますが、消去されません.つまり、このメソッドを呼び出すと、まだ読んでいないデータが忘れられます.また最初からcompact():データの読み出し時に、このメソッドが呼び出されると、未読み出しのデータがpositionの位置に移動する、データの完全な読み出しが保証される.
印刷結果:
参照先:http://ifeve.com/buffers/
NIOコアコンポーネント1.Chanel 2.Buffer 3.Selector(セレクタ)
Chanel 1.チャネルからデータを読み込むことも、チャネルにデータを書き込むこともできます.しかし、ストリームの読み書きは通常一方向である.2.チャネルは非同期で読み書きすることができる.3.チャネル内のデータは、常に1つのBufferに読み出されるか、または常に1つのBufferから書き込まれる.よく使われるChanel:FileChannelファイルからデータを読み書きします.
DatagramChannelは、UDPを介してネットワーク内のデータを読み書きすることができます.
SocketChannelは、TCPを介してネットワーク内のデータを読み書きすることができる.
ServerSocketChannelは、Webサーバのように、新しく入ってきたTCP接続を傍受することができます.新しい接続ごとにSocketChannelが作成されます.
Buffer Buffer三大コア:position,limit,capacity.positionは読み書きの位置を表す.limitは、書き込むデータの大きさを表す.CapacityはこのBufferの容量を表す.positionはデータの読み書きに従って下に移動し、最初は0、最大はcapacity-1である.Limitは書くときはcapacityに等しく、読むときは書き込むデータの最大値(capacityに等しくないがcapacity以下である)である.bufferは100メートルの道で、私たちがこの100メートルの中で歩いている歩数はpositionで、私たちが何メートル歩いたかはlimitです(データを読むことに限られています.サイズが知られているからです.).BufferのAPIflip():反転という意味で、チャネルからバッファに物を書くこともできるし、バッファからデータを読み取ることもできる.このメソッドを呼び出すと読み書きが反転する.clear():データを読み出した後、このメソッドを呼び出すとバッファ内のデータが空になりますが、消去されません.つまり、このメソッドを呼び出すと、まだ読んでいないデータが忘れられます.また最初からcompact():データの読み出し時に、このメソッドが呼び出されると、未読み出しのデータがpositionの位置に移動する、データの完全な読み出しが保証される.
package org.freebird.nio;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class Demo {
public static void main(String[] args) throws IOException {
RandomAccessFile raf = new RandomAccessFile("D:\\Film\\boyblue.txt", "rw");
FileChannel rafChannel = raf.getChannel();
// buffer
ByteBuffer byteBuffer = ByteBuffer.allocate(48);
//
int pos = rafChannel.read(byteBuffer);
while (pos != -1) {
System.out.println("READ:"+pos);
//
byteBuffer.flip();
while (byteBuffer.hasRemaining()) {
System.out.print((char)byteBuffer.get());
}
byteBuffer.clear();
pos = rafChannel.read(byteBuffer);
}
raf.close();
}
}
印刷結果:
READ:38
hey,can u here me hey boy blue is back
参照先:http://ifeve.com/buffers/