IO | NIO |
---|---|
面向流 | 面向缓冲区 |
阻塞IO | 非阻塞IO |
无 | 选择器 |
单向 | 双向 |
类比: IO流---》水流
无论 InputStream、OutputStream都是单向的
NIO 通道----》 铁路(本身不能运输),只负责数据的连接
NIO 缓冲区---》 火车(在文件、程序间来回“装卸”),负责数据的存取
Buffer
在NIO中负责数据的存取,缓冲区就是数组,用于存储不同类型的数据,根据数据类型不同(Boolean除外),提供相应类型的缓冲区:
- byteBuffer
- charBuffer
- longBuffer
- floatBuffer
- intBuffer
- shortBuffer
通过allocate()获取缓冲区。
-
核心方法 put get flip rewind clear(数据依然存在于缓冲区,但重回被遗忘状态--即所有指针还原到初始位置)
-
核心属性
// 位置::表示缓冲区中正在操作数据的位置
private int position = 0;
// 界限::表示缓冲区可以操作数据的大小(limit后面的数据不能读写)
private int limit;
// 容量::表示缓冲区中最大存储数据的容量::一旦声明不能改变(数组在确定大小之后就不能再改变大小了)
private int capacity;
position<=limit<=capacity
···private static final java.lang.String str = "abcde"; @Test public void test() { ByteBuffer byteBuffer = ByteBuffer.allocate(1024); // 初始 System.out.println(byteBuffer.limit() + "-" + byteBuffer.capacity() + "-" + byteBuffer.position()); // 1024-1024-0 // 写模式 byteBuffer.put(str.getBytes()); System.out.println(byteBuffer.limit() + "-" + byteBuffer.capacity() + "-" + byteBuffer.position()); // 1024-1024-5 // 读模式 Buffer flip = byteBuffer.flip(); System.out.println(byteBuffer.limit() + "-" + byteBuffer.capacity() + "-" + byteBuffer.position()); // 5-1024-0 // 相当于从buffer这个“火车”上卸货了 byte[] dst = new byte[byteBuffer.limit()]; byteBuffer.get(dst); //读出来的数据放在了 dst 这个字节数组里 System.out.println(new String(dst, 0, dst.length)); //abcde System.out.println(byteBuffer.limit() + "-" + byteBuffer.capacity() + "-" + byteBuffer.position()); //5-1024-5 // rewind状态,可重复读--position指针又指向了刚flip()的状态 byteBuffer.rewind(); System.out.println(byteBuffer.limit() + "-" + byteBuffer.capacity() + "-" + byteBuffer.position()); //5-1024-0 //清空clear后,缓冲区处于“被遗忘”状态(数据还在,但是capacity\limit\position变成初始状态) byteBuffer.clear(); byte b = byteBuffer.get(); System.out.println((char)b); //a System.out.println(byteBuffer.limit() + "-" + byteBuffer.capacity() + "-" + byteBuffer.position()); //1024-1024-1
}
···
buffer读写模式中属性变化
网友评论