NIO的理解
一、缓冲区(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状况
NIO的理解的更多相关文章
- 关于BIO和NIO的理解
摘要: 关于BIO和NIO的理解 最近大概看了ZooKeeper和Mina的源码发现都是用Java NIO实现的,所以有必要搞清楚什么是NIO.下面是我结合网络资料自己总结的,为了节约时间图示随便画的 ...
- Java I/O之NIO概念理解
JDK1.4的java.nio.*包引入了新的Java I/O新类库,其目的在于提高速度.实际上,旧的I/O包已经使用nio重新实现过,以便充分利用这种速度提高,因此即使我们不显式地用nio编码,也能 ...
- NIO流—理解Buffer、Channel概念和NIO的读写操作
NIO流与IO流的区别 面向流与面向块 IO流是每次处理一个或多个字节,效率很慢(字符流处理的也是字节,只是对字节进行编码和解码处理). NIO流是以数据块为单位来处理,缓冲区就是用于读写的数据块.缓 ...
- Java NIO之理解I/O模型
前言 自己以前在Java NIO这块儿,一直都是比较薄弱的,以前还因为这点知识而错失了一个机会.所以最近打算好好学习一下这部分内容,我想应该也会有朋友像我一样,一直想闹明白这块儿内容.但是一直无从下手 ...
- JAVA NIO的理解
在使用JAVA提供的Socket的IO方法时,服务端为了方便操作,会为每一个连接新建一个线程,一个线程处理一个客户端的数据交互.但是当大量客户端同服务端连接时,会创建大量的线程,线程之间的切换会严重影 ...
- NIO简单理解
NIO:新IO,同步的非阻塞IO. 1.Java NIO 由以下几个核心部分组成:Channels(通道).Buffers(缓冲区).Selectors(选择器) Channels(通道) 1.所有的 ...
- AIO和NIO的理解
AIO: AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成,可以继续做 另外的事情,等I/O操作完成,内核会通过函数回调或者信号机制通知用户进程.这样很大程度提高了 ...
- Java NIO之理解I/O模型(二)
前言 上一篇文章讲解了I/O模型的一些基本概念,包括同步与异步,阻塞与非阻塞,同步IO与异步IO,阻塞IO与非阻塞IO.这次一起来了解一下现有的几种IO模型,以及高效IO的两种设计模式,也都是属于IO ...
- Java NIO的理解和应用
Java NIO是一种基于通道和缓冲区的I/O方式,已经被广泛的应用,成为解决高并发与大量连接和I/O处理问题的有效方式. Java NIO相关组件 Java NIO主要有三个核心部分组成,分别是:C ...
随机推荐
- war文件—Web项目部署
war文件是什么? Web存档(war)文件包含Web应用程序的所有内容.它减少了传输文件所需要的时间. war文件的优点 节省时间:war文件将所有文件合并为一个单位. 所以在将文件从客户端传输到 ...
- 安全相关的Linux知识
本文用于记录在安全中的Linux常用命令,基础命令可以移步去菜鸟教程(https://www.runoob.com/linux/linux-tutorial.html)学习 Linux重要的4个热键 ...
- Jarvis OJ - [XMAN]level1 - Writeup
Jarvis OJ - [XMAN]level1 - Writeup M4x原创,转载请表明出处http://www.cnblogs.com/WangAoBo/p/7594173.html 题目: 分 ...
- vscode中vim插件对ctrl键的设置
vim配置 在使用中经常想使用ctrl-c,虽然在vscode中有配置选项可以让vim与ctrl键解绑,但是这样就使用不了vim的VISUAL BLOCK.所以进行了自定义设置. 设置 - Vim C ...
- js获取后台map格式数据
后台: @RequestMapping("/dictList") @ResponseBody public Map<String, Object> positionLi ...
- 算法_hdoj_1005
Question: Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 6 ...
- Zigbee 与 WiFi 的区别
zigbee 在蓝牙技术的使用过程中,人们发现蓝牙技术尽管有许多优点,但仍存在许多缺陷.对工业,家庭自动化控制和遥测遥控领域而言,蓝牙技术显得太复杂,功耗大,距离近,组网规模太小等,……而工业自动化对 ...
- python记之Hello world!
________________________________该动手实践了. 数和表达式 交互式Python解释器可用作功能强大的计算器. 除法运算的结果为小数,即浮点数(float或floatin ...
- 【做题笔记】洛谷P1036 选数
作为一个 DFS 初学者这题真的做得很惨...其实窝学 DFS 一年多了,然后一开始就学不会最近被图论和数据结构打自闭后才准备好好学一学233 一开始,直接套框架,于是就有 #include < ...
- ubuntu16.04无法打开终端
最近将自带的python3.5更改为默认的python3.6,所以就出现了终端打不开的情况,以下是我的解决办法: 首先,按ctrl+alt+F1进入命令行模式,也就是无图形截面,这时候会让你输入用户名 ...