二十四、JAVA的NIO和IO的区别
一、JAVA的NIO和IO
1、NIO:面向缓冲区(buffer)(分为非阻塞模式IO和阻塞模式IO)组成部分:Channels管道,Buffers缓冲区,Selectors选择器
2、IO:面向流(Stream)(阻塞的IO)
面向流:当一个线程调用read() 或 write()时,线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。流就像一根水管从操作系统的缓存中读取数据,而且只能顺序从流中读取数据,如果需要跳过一些字节或者再读取已经读过的字节,你必须将从流中读取的数据先缓存起来。
面向缓冲区:数据是先被读/写到buffer中的,根据需要你可以控制读取什么位置的数据。这在处理的过程中给用户多了一些灵活性,然而,你需要额外做的工作是检查你需要的数据是否已经全部到了buffer中,如果你还需要保证当有更多的数据进入buffer中时,buffer中未处理的数据不会被覆盖就行。
注:所有的JAVA的IO流都是阻塞的,JAVA NIO的阻塞模式NIO除了使用buffer存储数据以外和JAVA IO基本没区别。
JAVA NIO的非阻塞模式允许一条线程从管道channel中读取数据,通过返回值来判断buffer中是否有数据,如果没有数据,NIO不糊阻塞,不阻塞这个线程就意味着这个线程可以去做其他的事情,过一段时间再回来判断有没有数据。
JAVA NIO的写入也是如此,一个线程将buffer中的数据写入管道channel中,它不会等待数据全部写完才会返回,而是调用完write()方法就会继续向下执行。
二、JAVA NIO的Selectors(选择器)
选择器(Selectors)允许一个线程去监控多个channels的输入,也就是说可以在一个selector上注册多个管道channel,然后通过调用selector的select()方法判断是否有新的连接进来或者已经在selector上注册的channel是否有数据进入。selector的机制让一个线程挂你多个管道变简单。
//创建选择器
Selector selector=Selector.open();
//注册通道Channel
//与选择器Selector一块使用的时候,Channel必须是非阻塞模式。
channel.configureBlocking(false);
//第二个参数:Selector监听channel时所作的事件
//SelectionKey.OP_CONNECT/SelectionKey.OP_ACCEPT/SelectionKey.OP_READ/SelectionKey.OP_WRITE
SelectionKey key=channel.register(selector,SelectionKey.OP_READ);
//SelectionKey包含了interest集合,ready集合,Channel,Selector的对象。
int interestSet=key.interestOps();
总结:NIO允许用一个单独的线程或者几个线程管理很多个管道(channels),只是程序的处理会比JAVA IO更加复杂。
一般来说,你如果只有少量的连接但是每个连接都会占有很高的带宽,同时发送很多的数据,传统的JAVA IO会更好。
一般来说,如果你需要同时管理成千上万的连接,但是每个连接只是发送少量的数据,选择JAVA NIO会更好,比如一个聊天服务器,使用NIO更好。
三、JAVA NIO的Channel管道
主要包括了UDP,TCP,SOCKET等网络IO,以及File文件IO
FileChannel DatagramChannel SocketChannel ServlerSocketChannel
读取数据:
int bytesRead=inChannel.read(buf);
写入数据:
int bytesWrite=inChannel.write(buf);
/*SocketChannel通道*/
//建立SocketChannel通道
SocketChannel socketChannel=SocketChannel.open();
socketChannel.connect(new IntSocketAddress("LOL.exe",10));
//读取数据
ByteBuffer buf=ByteBuffer.allocate(20);
int bytesRead=socketChannel.read(buf);
//写入数据
String data="HelloWorld"+System.currentTimeMills();
ByteBuffer buf=ByteBuffer.allocate(20);
buf.clear();//清空整个缓冲区。
buf.put(data.getBytes());//写入数据
buf.flip();//将Buffer从写入模式切换到读取模式
while(buf.hasRemaining()){
socketChannel.write(buf);
}
四、JAVA NIO的Buffer缓冲区
主要包括了读基本数据类型的实现Buffer
ByteBuffer CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer ShortBuffer
二十四、JAVA的NIO和IO的区别的更多相关文章
- Java中 NIO与IO的区别
当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...
- JDK源码阅读-------自学笔记(二十四)(java.util.LinkedList 再探 自定义讲解)
一.实现get方法 1.一般思维实现思路 1).将对象的值放入一个中间变量中. 2).遍历索引值,将中间量的下一个元素赋值给中间量. 3).返回中间量中的元素值. 4).示意图 get(2),传入角标 ...
- Java学习笔记二十四:Java中的Object类
Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...
- Java进阶(二十四)Java List集合add与set方法原理简介
Java List集合add与set方法原理简介 add方法 add方法用于向集合列表中添加对象. 语法1 用于在列表的尾部插入指定元素.如果List集合对象由于调用add方法而发生更改,则返回 tr ...
- 二十四 java 多线程一些知识点
1:blocked线程和waiting的线程的区别? 如何唤醒? java线程中含有waiting与blocked两种状态: 线程的 blocked状态往往是无法进入同步方法/代码块来完成的(BLOC ...
- Java NIO 和 IO 的区别详解
Java NIO为jdk1.4提供了新的API,本文主要来比较一下Java中NIO和IO的区别,Java初学者可以了解一下. 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分 ...
- JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习
JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了 ...
- (C/C++学习笔记) 二十四. 知识补充
二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...
- Bootstrap<基础二十四> 缩略图
Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...
随机推荐
- 最受欢迎的前端框架 —— Bootstrap学习
Bootstrap是Twitter的Mark Otto和Jacob Thornton开发的,是目前最受欢迎的前端框架,它简单灵活,使得Web前端开发更加快捷方便. 首先,要基本掌握Bootstrap框 ...
- jquery事件重复绑定的几种解决方法 (二)
防止事件重复绑定共有4种方法: bind().unbind()方法 live().die()方法 off().on()方法 one()方法 一.bind().unbind()方法 bind();绑定事 ...
- _itemmod_strengthen_item
`enchant_id`升级后的附魔Id `prev_enchant_id` 上级附魔Id `description` 描述,出现在菜单中 `enchantReqId`升级附魔效果的消耗模板 `rem ...
- 删除node_modules文件
删除node_modules文件夹报错:路径太长,无法删除. npm install rimraf -g rimraf node_modules
- Jquery中的DOM操作:
DOM是 Document Object Model的缩写,是一种与浏览器,平台,语言无关的接口,使用该接口可以访问页面中所有的标准组件,下面介绍一下常用的一些DOM操作: 选择节点: 将在下篇博客中 ...
- ZZNUOJ 2022 摩斯密码
map打表存一下对应的密码 不会map感觉不好弄这题 #include<stdio.h> #include<string.h> #include<math.h> ...
- python使用sessions模拟登录淘宝
之前想爬取一些淘宝的数据,后来发现需要登录,找了很多的资料,有个使用request的sessions加上cookie来登录的,cookie的获取在登录后使用开发者工具可以找到.不过这个登录后获得的网页 ...
- 学习笔记41—ttest误区
1.grapPad软件里面双T结果和matlab,EXCEl里面双T结果一致时,设置如下:
- docker-compose在dockerfile更新后自动更新image
比如在dockerfile里需要新安装包 形如 加一行 RUN pip3 install XXX 之后,希望docker-compose能更新镜像, 然后启动容器 只需要启动时使用 --build即可 ...
- 牛客OI周赛4-提高组 C 战争(war)
战争(war) 思路: 二分答案, 找到第一个不满足条件的位置 首先对于一个值来说, 所有这个值的区间肯定有交区间, 然后在这个交区间内不能出现比它小的数 所以我们check时从大的值开始考虑, 求出 ...