Java NIO学习与记录(一):初识NIO
初识
工作中有些地方用到了netty,netty是一个NIO框架,对于NIO却不是那么熟悉,这个系列的文章是我在学习NIO时的一个记录,也期待自己可以更好的掌握NIO。
一、NIO是什么?
非阻塞式IO,与传统的BIO(阻塞式IO)不同,NIO可以通过通道(Channels)来监听各通道的动作,一个线程就可以完成对多个通道的动作监听,这些动作包括连接就绪、写就绪、读就绪等,举个例子,建立连接这个动作在BIO中会发生阻塞,直到连接建立完成,而在NIO中,建连只是单线程里Selector监听的一个动作,也就是说在建立连接之前(即建连就绪之前),这个线程是可以继续处理其他动作的(比如读、写等等)。没有传统IO在IO交互时的阻塞现象,仅通过一个线程来处理n多IO通道(Channels),大大提升了程序的处理能力。
二、NIO核心组成部分
1.Channels & Buffer
这两个放在一起讲,Channel是指各种IO通道(包括File、Socket等),也可以理解为双向IO流,即:Channel既可以将自己的内容读到Buffer中,也可以从Buffer中读取数据写入到自己里面。其次,Channel并不一定是双向的,一个Channel如果实现定义read( )方法的 ReadableByteChannel 接口,而另一个 Channel 类也许实现 WritableByteChannel 接口以提供 write( )方法。实现这两种接口其中之一的类都是单向的,只能在单个方向上传输数据。如果一个类同时实现这两个接口,那么它是双向的,可以双向传输数据(读&写)。
结合上面描述,Buffer是一个容器,负责存储从Channel里读到的数据或者存储准备写入Channel的数据,属于一个缓冲区。
常见的Channel:
FileChannel:文件通道
DatagramChannel:一个能收发UDP包的通道。因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入。它发送和接收的是数据包
SocketChannel:一个连接到TCP网络套接字的通道
ServerSocketChannel:一个可以监听新进来的TCP连接的通道
常见的Buffer:
ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer
可以发现,涵盖了基本传输的数据类型。
2.Selector
可以理解为“Channel事件选择处理器”,第一部分有提到说NIO属于非阻塞式IO,关键点在于Selector可以运行于一个单线程里,然后通过一个死循环(阻塞方法)来监听注册到选择器内的Channel的事件(注意这里,一个Channel的事件想要被选择器监听到,则要求该Channel必须注册到选择器里),这些事件上面也提到过包含:连接就绪、写就绪、读就绪等。这些动作全部由Channel自己完成,什么时候完成了通知选择器去进行相应的逻辑处理即可,而不必阻塞在IO交互上(也是与传统BIO不同的点),选择器工作如下图:

本篇简单介绍了下NIO,接下来将会介绍具体如何去使用
Java NIO学习与记录(一):初识NIO的更多相关文章
- Java NIO学习与记录(八): Reactor两种多线程模型的实现
Reactor两种多线程模型的实现 注:本篇文章例子基于上一篇进行:Java NIO学习与记录(七): Reactor单线程模型的实现 紧接着上篇Reactor单线程模型的例子来,假设Handler的 ...
- Java NIO 学习笔记(七)----NIO/IO 的对比和总结
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO学习与记录(二):FileChannel与Buffer用法与说明
FileChannel与Buffer用法与说明 上一篇简单介绍了NIO,这一篇将介绍FileChannel结合Buffer的用法,主要介绍Buffer FileChannel的简单使用&Buf ...
- Java NIO学习与记录(七): Reactor单线程模型的实现
Reactor单线程模型的实现 一.Selector&Channel 写这个模型需要提前了解Selector以及Channel,之前记录过FileChannel,除此之外还有以下几种Chann ...
- Java NIO学习与记录(六): NIO线程模型
NIO线程模型 上一篇说的是基于操作系统的IO处理模型,那么这一篇来介绍下服务器端基于IO模型和自身线程的处理方式. 一.传统阻塞IO模型下的线程处理模式 这种处理模型是基于阻塞IO进行的,上一篇讲过 ...
- Java NIO学习与记录(五): 操作系统的I/O模型
操作系统的I/O模型 在开始介绍NIO Reactor模式之前,先来介绍下操作系统的五种I/O模型,了解了这些模型,对理解java nio会有不小的帮助. 先来看下一个服务端处理一次网络请求的流程图: ...
- Java NIO学习与记录(四): SocketChannel与BIO服务器
SocketChannel与BIO服务器 SocketChannel可以创建连接TCP服务的客户端,用于为服务发送数据,SocketChannel的写操作和连接操作在非阻塞模式下不会发生阻塞,这篇文章 ...
- Java NIO学习与记录(三): Scatter&Gather介绍及使用
Scatter&Gather介绍及使用 上一篇知道了Buffer的工作机制,以及FileChannel的简单用法,这一篇介绍下 Scatter&Gather 1.Scatter(分散 ...
- Java IO 学习(四)BIO/NIO
本文会尝试介绍Java中BIO与NIO的范例与原理 使用的模型非常简单:服务器--客户端模型,服务器会将客户端发送的字符串原样发回来.也就是所谓的echo server. BIO 也就是所谓的Sock ...
随机推荐
- [Training Video - 5] [Groovy Script Test Step - Collections, Exceptions] Array and ArrayList
Array: def x = new String[5] x[0] = "India" x[1] = "USA" x[2] = "Korea" ...
- windows查看内存频率
命令行查看: wmic memorychip 任务管理器查看: 任务管理器-性能-内存-速度
- 我大中华微软MVP中国区人才库(转)
出处:http://www.genshuixue.com/i-cxy/p/15349735 刘海峰:国内知名微软开源技术网站51Aspx 创始人,十年以上的asp.net从业经验,微软MSDN特约讲师 ...
- UIWebview与js交互[转]
UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS ...
- iPhone4 8.3 系统下字体下方去除下划线
NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:@"先去看看 ...
- SDWebImage从缓存中获取图片
if ([[SDImageCache sharedImageCache] imageFromKey:sort.imageUrl]) { [cell.photoImageView s ...
- postman的使用方法详解!最全面的教程
文章来源:http://www.cnplugins.com/tool/specify-postman-methods.html 一 简介 Postman 是一款功能超级强大的用于发送 HT ...
- Lucene之模糊、精确、匹配、范围、多条件查询
Lucene的查询方式很 丰富,对于数值类型的数据,采取TermRangeQuery的方式,对于String类型的,就可以采取TermQuery等,查询方式了,可以通过采取合适的查询方式,检索到数据. ...
- 基于微软XAML技术的前端开发方法
使用XAML技术的平台目前包括WPF,Silverlight,Windows8等平台,未来的Windows10统一Windows App也使用XAML技术. 前端开发指通过可视化集成开发环境进行用户界 ...
- Xshell传输文件
用rz,sz命令在xshell传输文件 很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz 首先你的Ubuntu需要安装rz.sz(如果没有安装请执 ...