8-「季淳卿」NIO New (Non-Blocking IO) 同步非阻塞IO 案例

java大型游戏和服务器都是基于NIO,由选择器选择那个时间段对那个通道进行操作
1.2.1 Channel 通道,渠道
- 不管是那种媒介,都可以用Channel通道
- <是双向通道,即可输出,也可输入>

1.2.2 Buffer 缓冲区(难理解)
- 所有通道都写在Buffer里面
- - 专门在NIO中保存数据(存放数据的地方)
暂时无法在文档外展示此内容

Buffer创建有两种方式

  • allocate 在堆空间分配数据空间 (new一个区域给buffer)

    1. java全部的对象都是放在堆空间,而堆空间是运行在Java的JVM虚拟机中,用来保存数据的
    2. 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 的使用、创建、切换

  1. 创建一个字节缓冲区
  2. 写一个spring内容
  3. 把spring中的内容写到缓冲区(注意ByteBuffer需要的是字节类型)
  4. 切换为读模式
  5. new一个字符数组
  6. 从buffer中取出数据
  7. 查看就需要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);
}

今天学习结束啦✿✿ヽ(°▽°)ノ✿
有什么问题欢迎大家提出来,一起进步

世界灿烂盛大,欢迎回家 —— 《全球高考》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季淳卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值