チャネルの概要#
- 入出力通信のチャネルであり、InputStream や OutputStream に似ています。
- チャネルには方向性がありません。
- 一般的なチャネル
- ファイル操作
FileChannel、データの読み書きを行います。- ネットワーク操作
SocketChannel、TCP を介してネットワーク上のデータの読み書きを行います。
ServerSockectChannel、新しい TCP 接続を監視し、Web サーバーのように動作します。新しい接続ごとに SocketChannel が作成されます。
DatagramChannel、UDP を介してネットワーク上のデータの読み書きを行います。
-
チャネルの取得方法
- FileInputStreanm/FileOutputStream
- RandomAccessFile
- Socket
- ServerSocket
- DatagramSocket
バッファの概要#
- チャネルから読み取られるか書き込まれるデータは、プログラムが操作するためにバッファに書き込まれる必要があります。
- チャネルには方向性がないため、読み書きを区別するために、読み取りモードと書き込みモードが導入されました。
- 一般的なバッファ
- ByteBuffer 一般的に使用されます
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
- MappedByteBuffer.. 一般的に使用されます
- バッファの取得方法
- ByteBuffer.allocate(10);
- encode()
package nio;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* NIOのチャネルとバッファの使用
* **/
public class Main {
public static void main(String[] args) throws IOException {
// 1. ファイルのチャネルを取得する
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Administrator\\IdeaProjects\\untitled\\1.txt");
FileChannel channel = fileInputStream.getChannel();
// バッファを作成する
ByteBuffer buffer = ByteBuffer.allocate(10);
while(true){
// チャネルからデータを読み取り、バッファは作成時に書き込みモードになっているため、モードを切り替える必要はありません
// channel.readの戻り値のintが-1の場合、データがないことを示し、それ以外の場合は読み取ったバイト数を返します
int read = channel.read(buffer);
// -1が返された場合、ループを終了します
if (read == -1)break;
// 読み取りモードに切り替える
buffer.flip();
// バッファからデータを読み取るためのループです。buffer.hasRemaining()はバッファにデータがあるかどうかを判断するために使用できます
while (buffer.hasRemaining()){
byte b = buffer.get();
System.out.println((char)b);
}
// 最後にデータの読み取りが終了したら、書き込みモードに切り替えます(このプログラムでは書き込みモードに切り替えなくても動作しますが、読み取り後にモードを切り替えることは良いプログラミングの習慣であり、将来的に問題を回避するためのものです)
buffer.clear();
}
}
}
NIO 開発の手順のまとめ#
- チャネルを取得する
- バッファを作成する
- channel.read (buffer); // チャネルからデータを取得し、バッファに読み込む。操作を行う。
buffer.flip ();// 読み取りモードに設定
buffer.get (); // バッファからデータを取得するためのループ
buffer.clear ();// 書き込みモードに設定