Channel ByteBuffer

idea快捷键:

Ctrl + Q 查看方法简介

Ctrl + Shift + Enter 格式化代码

Ctrl + O 重写方法

Channel方法:

channel.read(byteBuffer)读取数据

channel.write(byteBuffer)写数据

channel.transferTo( position, size, targetChannel) 将一个读channel写入一个写channel中

文件操作拓展

文件夹 Files.walkFileTree( Path, SimpleFileVisitor// 需要重写方法)

获取ByteBuffer几种方式:

ByteBuffer.allowcate( size );

StandardCharsets.xxx(UFT-8).encode( String ); //会自动切换成读模式

ByteBuffer.warp( byte[] array); //会自动切换成读模式

ByteBuffer方法:

flip() 切换读模式

clear()切换写模式

compact()将未写完的数据压缩,并且切换成读模式 //文件最多为2g

NIO

单线程处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static void main(String[] args) throws IOException {

// 创建缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocate(16);

// 创建服务器
ServerSocketChannel ssc = ServerSocketChannel.open();
// 设置为非阻塞,影响accept方法
ssc.configureBlocking(false);

// 绑定端口
ssc.bind(new InetSocketAddress(8080));

List<SocketChannel> channels = new ArrayList<>();

for (;;) {
// 建立客户端连接
SocketChannel sc = ssc.accept();
//非阻塞模式下,未接收到accept,返回值为null
if (Objects.nonNull(sc)) {
//channel 设置为非阻塞,影响read方法
sc.configureBlocking(false);
channels.add(sc);
}

// 遍历数据
for (SocketChannel channel : channels) {
if (channel.read(byteBuffer) > 0) {
byteBuffer.flip();
System.out.println(byteBuffer);
byteBuffer.clear();
}
}
}

}

selector

事件类型

  • accpet :请求连接时触发

  • connet :客户端建立连接后触发

  • read : 可读事件

  • write : 可写事件