Java8 新特性 NIO 缓冲区

IO & NIO 的区别

NIO

Java NIO (New IO Non Blocking IO) 是从 Java1.4 版本引入的一个新的 IO API,可以替代标准的 Java IO API。

NIO 与原来的 IO 有着同样的作用和目的,但是使用的方式不同,NIO 支持面向缓冲区的基于通道的IO操作。NIO 将更加高效的方式进行文件读写操作。

区别

IO NIO
面向流 (Stream) 面向缓冲区(Buffer)
阻塞IO (Blocking IO) 非阻塞IO(Non Blocking IO)
选择器(Selecors)

mark

缓冲区 (Buffer)

创建缓冲区(allocate)

缓冲区本质就是数组,用于存储不同的数据

缓冲区类型:ByteBufferCharBufferShortBufferIntBufferLongBufferFloatBufferDoubleBuffer

// 分配一个指定大小的 Byte 缓冲区(大小必须指定)
ByteBuffer bbuffer = ByteBuffer.allocate(1024);

读 & 取 缓冲区的两大核心方法

缓冲区放入数据 (put)

放入方法 put() 有很多重载

mark

这里说明一下第一种:put(byte[] src, int offset, int length)

  • byte[] src : 放入缓冲区的数组
  • int offset : 放入缓冲区数组的偏移量
  • int length :偏移量向后放入 length 位数据到缓冲区

后两个参数为可选,不设置,表示把整个数组放入缓冲区。

// String s = "abcde";
byte[] bytes = new byte[]{'a','b','c','e','f'};
// 数据放入缓冲区
// bbuffer.put(s.getBytes());
bbuffer.put(str.getBytes());

读取缓冲区数据 (get)

在读取缓冲区数据之前,需要转换缓冲区模式 为 读取模式

bbuffer.flip(); // 读取缓冲区数据 首先需要切换缓冲区模式
System.out.println(bbuffer.get(0)); // 97 打印出来的是字节码

清空缓冲区

但是 '清空' 后,缓冲区的数据依然存在,处于被遗忘状态

bbuffer.clear();

mark

缓冲区的四大核心属性

大小关系: mark <= position <= limit <= capacity

  • capacity :容量,代表缓冲区存储数据的大小,一旦声明不能改变
  • limit :界限,表示缓冲区可以操作数据的大小(limit 后的数据不能进行读写)
  • position :位置,表示缓冲区正在操作数据的位置
  • mark : 标记,表示记录当前 position 的位置,可以通过 reset() 恢复到 mark 位置。

创建缓冲区时

mark

写入数据时

mark

读取数据时

mark

mark

mark 记录 position 的位置

@Test
public void test(){
    byte[] bytes = new byte[]{'a','b','c','e','f'};
    // 创建 放入数据 切换模式
    ByteBuffer buf = ByteBuffer.allocate(10);
    buf.put(bytes);
    buf.flip();
    // 记录 position 的位置
    buf.mark();
    // 创建新的数组 取出缓冲区的数据,添加到 des 字节数组
    byte[] des = new byte[buf.limit()];
    buf.get(des,0,2);
    // 输出数组的值
    System.out.println(new String(des,0 ,2));

    System.out.println(buf.position());
    buf.reset(); // 恢复 position 到 mark 位置
    System.out.println(buf.position());
}

mark

发表评论 / Comment

用心评论~