NIO之初步认识

一,缓冲区

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()转成字符数组

猜你喜欢

转载自blog.csdn.net/Estelle_ya/article/details/81606115
今日推荐