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) |
缓冲区 (Buffer)
创建缓冲区(allocate)
缓冲区本质就是数组,用于存储不同的数据
缓冲区类型:ByteBuffer
、CharBuffer
、ShortBuffer
、IntBuffer
、LongBuffer
、FloatBuffer
、DoubleBuffer
// 分配一个指定大小的 Byte 缓冲区(大小必须指定) ByteBuffer bbuffer = ByteBuffer.allocate(1024);
读 & 取 缓冲区的两大核心方法
缓冲区放入数据 (put)
放入方法 put() 有很多重载
这里说明一下第一种: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 <= position <= limit <= capacity
- capacity :容量,代表缓冲区
存储数据的大小
,一旦声明不能改变 - limit :界限,表示缓冲区
可以操作数据的大小
(limit 后的数据不能进行读写) - position :位置,表示缓冲区
正在操作数据的位置
。 - mark : 标记,表示
记录当前
position 的位置,可以通过 reset() 恢复到 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()); }
版权声明:《 Java8 新特性 NIO 缓冲区 》为明妃原创文章,转载请注明出处!
最后编辑:2020-6-22 13:06:02