一,缓冲区
Buffer : 在java NIO 中负责存取数据,它本身就是一个数组,用于存储不同数据类型的数据
根据数据类型不同(boolean除外),提供相应类型的缓冲区,
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
这些缓冲区的管理方式几乎一致,通过allocate()获取缓冲区
二,缓冲区存取数据的2个核心方法
Put() 存入数据到缓冲区中
Get() 获取缓冲区中的数据
三,缓冲区中的四大核心属性
Capacity : 容量 表示缓冲区中最大存储数据的容量,一旦声明不能改变
Limit : 界限 表示缓冲区中可以操作数据的大小(limit后的数据不能读写)
Position : 位置 表示缓冲区中正在操作数据的位置
Mark : 标记 表示当前position的位置,可以通过reset()恢复到mark位置
0 <= mark <= Postion <= limit <= capacity
Allocate()—-非直接字节缓冲区
AllocateDirect()工厂方法,—-直接字节缓存区(分配和取消分配缓存区,所需的成本比上面的高),避免把数据复制到中间内存中,减少内存复制,jvm最大程度来执行本机的io操作
四,直接与非直接缓存区
前者效率高,把数据存储在 物理内存的映射文件中,但是如果存进去之后,交给了操作系统(比如os)来执行,如果缓存中不释放资源,那么程序不能结束,效能不稳定. 一般用于容易受io操作影响的 大型,持久的缓冲区.
而后者
一,通道
连接源节点和目标节点,负责缓存区中数据的传输,本身不存储数据
二,通道的主要实现类
Java.nio.channels.Channel接口
FileChannel
SocketChannel
ServerChannel
DatagramChannel
三,获取通道
1.支持通道的类,提供的有 getChannel()方法,
本地IO
FileInputStream/..out..
RandomAccessFile
网络IO
Socket
ServerSocket
DatagramSocket
2.JDK1.7中 NIO.2 针对各个通道提供了 静态方法open()
3.和 Files工具类的newByteChannel()
四,通道之间的数据传输 transferTo() transferFrom()
五, 分散scatteing reads和聚集gather writes
分散:[通道中的数据,分散到多个缓冲区中] 把channel中的数据,一次读入到多个Buffer中,把他们依次填满.
new String(bufs[1].array(),0,bufs[1].limit())
//.array()转成字符数组