二十四、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 创建缩略图的步骤如下: 在图像周围添加带有 ...
随机推荐
- HDU 5985 Lucky Coins(概率)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5985 题意:有多种类型的硬币,每种类型的硬币都有一定的数量,现在每次抛硬币,除去朝下的硬币,知道最后 ...
- latex 脚注编号也成为超链接
我们用LaTeX写文章时,往往会引用tabularx和hyperref两个包,当我们想让脚注编号也成为超链接以方便阅读时,往往会发现在hyperref包的属性里设置hyperfootnotes=tru ...
- Vue运行报错--eslint
Errors:? 1? http://eslint.org/docs/rules/no-trailing-spacesYou may use special comments to disable s ...
- python 目录切换
#- * -coding: utf - - * - import os, sys path = "c:\\" # 查看当前工作目录 retval = os.getcwd() pri ...
- PL/SQL Developer安装配置
选择tool下的perferences 修改下面标记的内容即可
- JCF
点我 补两个红黑树原理:https://www.cnblogs.com/yyxt/p/4983967.html https://www.cnblogs.com/skywang12345/p/324 ...
- C/C++.文件是否存在
1. 2._access, _waccess.html(https://msdn.microsoft.com/en-us/library/1w06ktdy.aspx) int _access( con ...
- asp.net 虹软人脸识别sdk 释放内存
初始化时申请内存,用完记得释放,不然就会报“内存已满”的. 使用时: pMem = Marshal.AllocHGlobal(detectSize); 释放内存: Marshal.FreeHGloba ...
- django生成迁移文件
1.创建虚拟环境 在终端上输入创建python3的虚拟环境 mkvirtualenv -p python3 虚拟环境的名字 安装django和pymysql 2.创建项目创建工程的命令: django ...
- Codeforces 981 E - Addition on Segments
E - Addition on Segments 思路: dp dp[i]表示构成i的区间的右端点 先将询问按r排序 然后,对于每次询问,每次枚举 i 从 n-x 到 1,如果dp[i] >= ...