java大型游戏和服务器都是基于NIO,由选择器选择那个时间段对那个通道进行操作
1.2.1 Channel 通道,渠道
- 不管是那种媒介,都可以用Channel通道
- <是双向通道,即可输出,也可输入>
1.2.2 Buffer 缓冲区(难理解)
- 所有通道都写在Buffer里面
- - 专门在NIO中保存数据(存放数据的地方)
Buffer创建有两种方式
-
allocate 在堆空间分配数据空间 (new一个区域给buffer)
- java全部的对象都是放在堆空间,而堆空间是运行在Java的JVM虚拟机中,用来保存数据的
- JVM 虚拟机 -软件 -运行在内存里面
-
allocateDirect 直接在内存分配空间 (直接跳开JVM,在内存中开辟一个空间)
优缺点:
- allocate
-
因为是分配在虚拟机jvm堆空间,不用的时候,内容会被垃圾回收机制自动回收
-
还要在jvm处理,数据处理慢,效率低
- allocateDirect
- 由于是分配在内存中,会把内存打满,需要我们手动去清理
- 数据处理块 ,处理效率高
1.2.3 Selector 选择器
- 调动员(如:飞机从那个通道去起飞,降落在哪里)
- 调用 通道
使用到的方法如下:
ByteBuffer —— 方法 | 描述 |
---|---|
allocate(int capacity) | 分配一个新的字节缓冲区 |
allocate Direct(int capacity) | 分配一个新的直接字节缓冲区 |
put(byte [ ] b) | 是把内容写到缓冲区 |
get(byte[ ] dst ) | 返回当前缓冲区位置上的值 |
String —— 方法 | 描述 |
---|---|
getBytes() | 把String字符串转为Byte字节数组 |
Buffer —— 方法 | 描述 |
---|---|
flip() | 翻转这个缓冲区 |
& - [ 代码 ] buffer 的使用、创建、切换
- 创建一个字节缓冲区
- 写一个spring内容
- 把spring中的内容写到缓冲区(注意ByteBuffer需要的是字节类型)
- 切换为读模式
- new一个字符数组
- 从buffer中取出数据
- 查看就需要new一个Spring数组
```php
```java
public static void main(String[] args) {
/**
* Buffer 有两种创建方式
* Buffer 的类型 —— 与基本数据内容相同
* 推荐使用 字节操作 一个字节(byte)是由 8个 二进制(bit)组成,使用字节不需要关心数据的字符编码
* (在不同字符编码下,同一个字符占用的空间是不一样的)
* 字符操作最后还是以二进制操作
*/
ByteBuffer allocate = ByteBuffer.allocate(256);// allocate() 创建一个 字节缓冲区
String data = "世界灿烂盛大,欢迎回家"; // 一个汉字 = 三个字节 = 八二位(二进制)
//byteBuffer 由两种模式 : 读和写 ,默认的是写模式
//因为 ByteBuffer需要的是字节类型 ,所有使用 getBytes() 所有把 String字符串转为 Byte字节数组写
allocate.put(data.getBytes());// put() 是把内容写到缓冲区
System.out.println(allocate.position());//位置
System.out.println(allocate.limit());//阀值
System.out.println(allocate.capacity());//容量
allocate.flip();//切换为读模式
System.out.println(allocate.position());
System.out.println(allocate.limit());
System.out.println(allocate.capacity());
byte[] readdata = new byte[27];
allocate.get(readdata);// 需要传入一个空的字节数组) 从buffer里面 读取指定长度的数据
String str = new String(readdata);//想查看字节数组里面的值 就必须转换为字符串
System.out.println(str);
}
今天学习结束啦✿✿ヽ(°▽°)ノ✿
有什么问题欢迎大家提出来,一起进步
世界灿烂盛大,欢迎回家 —— 《全球高考》