一、缓冲区(Buffer):在java NIO中负责数据的存取,实际上就是数组,用于存储不用数据类型的数据,根据数据类型不同(boolean除外),提供了相应类型的缓冲区(ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer),管理方式几乎一致,都是使用allocate()分配。

put()存入数据

get()取出数据

flip()切换成读取数据模式,position归0,limit变成最大可操作数,若之前插入了5个字节数据,则limit变成5,因为索引5后面不存在数据,无法操作,capacity保持不变。

rewind()读数据的position归0,相当于可以再次读取

clear()各个属性还原初始化,但实际不清空数据缓冲区中的内容,数据处于一种被遗忘的状态,因为各个属性回归最初状态,导致无法正确读取原始数据

缓存区中的4个核心属性:

1.capacity:容量,表示缓冲区中最大的存储容量,一旦声明不能改变

2.limit:界限,表示缓冲区中可以操作数据的大小,limit后的数据不能进行读写

3.position:位置,表示缓冲区中正在操作数据的位置。

4.mark:标记,表示记录当前position的位置,可以通过reset()恢复到mark的位置

0<=mark<=position<=limit<=capacity

直接缓冲区与非直接缓冲区

非直接缓冲区:使用allocate()分配缓冲区,将缓冲区建立在JVM内存中

直接缓冲区:通过allocateDirect()方法分配缓冲区,可以直接将缓冲区建立在操作系统的物理内存中,使用直接缓冲区,有时候会产生数据已经传输完成,但是程序未执行完成,cpu占用飙升,这是因为jvm对物理内存的占用还没解除,需要gc自动进行回收后才会恢复,内存映射文件也是直接缓冲区的方式

通道(channel):用于源节点与目标节点的连接,在java NIO中负责缓冲区的数据传输。Channel本身不包含数据,因此需要配合缓冲区进行使用

通道的主要实现类

  java.nio.channels.Channel

    |--FileChannel

    |--SocketChannel

    |--ServerSocketChannel

    |--datagramChannel

获取通道

  1.java针对支持通道的类提供了getChannel()方法

  本地IO:

    FileInputStream/FileOutputStream

    RandomAccessFile

  网络IO:

    Socket

    ServerSocket

在JDK1.7中提供了针对各个通道的open()静态方法

在JDK1.7中提供了Files工具类的newByteChannel()方法

分散(Scatter)与聚集(Gather)

分散读取:将通道中的数据分散到多个缓冲区中

聚集写入:将多个缓冲区中的数据聚集到一个通道中

使用NIO完成网络通信的三个核心,FileChannle不能使用选择器,因为不能是非阻塞的。非阻塞只针对网络通信

1.通道(Channel):负责连接

  java.nio.channels.Channel 接口:

    |--SelectableChannel

      |--SocketChannel:

      |--ServerSocketChannel:

      |--DatagramChannel:

    

2.缓冲区(Buffer):负责数据的存取

3.选择器(Selector):是SelectableChannel的多路复用器,用于监控SelectableChannel的IO状况

最新文章

  1. Burpsuite+sqlmap批量扫描sql漏洞
  2. css常用鼠标指针形状代码
  3. CocoaPods使用详细说明
  4. css居中解决方案
  5. JVM_Bind:8080 的解决办法【131031】
  6. [Spring] - 动态设置properties
  7. MUI - 图片预览(perviewimage)的优化
  8. 【读书笔记】iOS-UIFont-如何知道字体的PostScript名称
  9. Xshell下VI打开文件中文乱码解决
  10. win7下80端口被(Pid=4)占用的解决方法
  11. php download断点
  12. oracle模糊查询效率提高
  13. 我为什么放弃Go语言
  14. Razor学习(二)@Html标签
  15. IT人为什么难以拿到高薪?【转帖】
  16. HTML5 开发APP( 环境配置)
  17. Android初级教程理论知识(第六章广播接受者)
  18. 多项式细节梳理&amp;模板(多项式)
  19. C语言程序设计II—第九周教学
  20. asp 调用 vb(activex dll) ,参数传递(传引用)需要注意

热门文章

  1. 运筹学学报-运行问题之新版TeX系统支持修改
  2. 题解【洛谷P5658】[CSP-S 2019]括号树
  3. vue+muse-ui
  4. centos7安装谷歌浏览器
  5. Unity 读取Json常用的两种方式
  6. C#中ESRI.ArcGIS.esriSystem的引用问题
  7. Django路由层、视图层
  8. Android开发实战——记账本(6)
  9. Oracle创表操作记录
  10. 传奇HERO引擎给装备加套装属性技巧