チャネルの概要#
- 入出力通信のチャネルであり、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は、-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 ();// 書き込みモードに設定