通道channel就像流。通道中的数据总是先读到到buffer中(对于buffer来说是一个写操作),再从buffer中写到另一个通道总(相对于buffer来说是一个读操作)。
Channel主要分为两类:文件channel和网络channel,细分为4种。
FileChanel:从普通文件中读写数据
DatagramChannel:通过UDP读写网络中的数据
SocketChannel:通过TCP读写网络中的数据
ServerSocketChannel:监听新进来的TCP连接,对每个新进来的连接都创建一个SocketChannel。
其中FileChannel不可以切换到非阻塞模式,不能应用到selector中。而所有套接字channel都可以应用到非阻塞模式。
示例代码如下:
public static void main(String[] args) {
try {
//获取maven工程的resource的路径,这个获得的是绝对路径
String path = FileChannelTest.class.getResource("/").getPath();
//文件存放在resource目录下
String file = "data.txt";
RandomAccessFile randomAccessFile = new RandomAccessFile(path + file, "rw");
//创建channel
FileChannel fileChannel = randomAccessFile.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(5000);
//从channel中读取数据到buffer
int byteRead = fileChannel.read(byteBuffer);
while (byteRead != -1) {
byteBuffer.flip();
while (byteBuffer.hasRemaining()) {
System.out.println((char)byteBuffer.get());
}
byteBuffer.clear();
byteRead = fileChannel.read(byteBuffer);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}