记录生活中的点点滴滴

0%

day21

一、NIO的使用中两个重要的要素:

 缓冲区(Buffer)、通道(Channel)

 缓冲区(Buffer):存储数据的。 —->byte[] buffer = new byte[1024]

 通道(Channel):代表着数据源与目标节点之间的连接,负责缓冲区的传输。 —>IO流

 二者的交互:Java NIO 中的 Buffer 主要用于与 NIO 通道(Channel)进行交互, 数据是从通道读入缓冲 区, 从缓冲区写入通道中的。

二、缓冲区(Buffer)的结构 (除boolean之外)

 java.nio.Buffer抽象类

  |—-ByteBuffer

  |—-CharBuffer

  |—-ShortBuffer

  |—-IntBuffer

  |—-LongBuffer

  |—-FloatBuffer

  |—-DoubleBuffer

XxxBuffer底层使用xxx[]进行存储。

三、如何实例化缓冲区?调用缓冲区类XxxBuffer的静态方法:allocate(int capacity)

  举例:ByteBuffer byteBuffer = ByteBuffer.allocate(10);byte[] hb = new byte[10];

  类似:ArrayList list = new ArrayList(10);//Object[] eleData = new Object[10];

 说明:方法的形参,决定了底层创建的数组的长度

四、Buffer中的常用属性:

  capacity:容量,决定了底层数组的长度,表明了最大存储数据的容量

  limit:限制,默认情况下,limit等于capacity.在读数据模式下,limit<=capacity.表明最大可以读取数据的量position:位置,表明了当前读取或写入数据的位置

  mark:标记。默认值为-1.

  关系式:mark <= position <= limit <= capacity

  类比:项目三中TeamService类中的属性:

   private final int MAX_MEMBER = 5;//相当于capacity

   private Programmer[] team = new Programmer[MAX_MEMBER];//Buffer底层封装的数组

   private int total;//相当于limit

   index:读取、写入数组指定为的索引:position

五、Buffer中的常用方法:

  1)最基本的两个方法:put(Xxx xxx) / get()

  2)其他方法:见ppt中的表格即可。

六、针对于ByteBuffer来讲,可以创建非直接缓冲区:allocate(int capacity)

​ 直接缓冲区:allocateDirect(int capacity) / FileChannel 的 map()

了解非直接缓冲区 与 直接缓冲区的区别

byteBuffer.put(“hello”.getBytes());//写入长度为5的字节数.每put一个字节,position就+1

byteBuffer.flip();//切换为读数据模式。将limit设置为position,position归零

byteBuffer.rewind();//重置position

byteBuffer.clear();//清空.将position归零,limit设置为capacity.数据并未删除。

byteBuffer.get(dst,0,2);//从数组角标0开始,写入两个字节的数组

if(byteBuffer.hasRemaining()){

//判断是否还有元素没有读取到。

​ System.out.println(byteBuffer.remaining());//还有几个没有读取到。

}System.out.println();