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 ...
随机推荐
- 年末福利,C/S应用升级更新完整解决方案放送
程序员,工作累寿命短,大家应该学会分享,别浪费有限的生命与健康做重复的事情. C/S方式实现的应用有个升级更新功能是必需的,以前整过一个但是没考虑多套C/S应用的情况,那个时候公司只有一套系统,现在又 ...
- JMS规范简介
一.JMS规范 Java消息服务定义: Java消息服务(Java Message Service)即JMS,是一个Java平台中面向消息中间件的API,用于在两个应用程序之间或分布式系统中发送/接受 ...
- Fork/Join 型线程池与 Work-Stealing 算法
JDK 1.7 时,标准类库添加了 ForkJoinPool,作为对 Fork/Join 型线程池的实现.Fork 在英文中有 分叉 的意思,而 Join 有 合并 的意思.ForkJoinPool ...
- (一)JQuery动态加载js的三种方法
Jquery动态加载js的三种方法如下: 第一种: $.getscript("test.js"); 例如: <script type="text/javascrip ...
- B-Spline 样条学习笔记
(1) 对于clamped样条曲线,节点区间的数目等于曲线段的数目. eg: B-样条曲线有11个控制点(即,n = 10), 3次P样条 (即, p=3) ,由 m=n+p+1 则有15 个节点 ...
- 【node错误】/usr/bin/env: node: No such file or directory
背景 安装了node后,执行npm run xxx的命令的时候,报错,提示如下: /usr/bin/env: node: No such file or directory 步骤 1. 什么玩意,执行 ...
- 基于docker创建的Jenkins,settings.xml文件放在哪里
如果运行容器时挂载目录如下 启动容器 docker run -itd -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true --r ...
- 使用 IIS 在 Windows 上托管 ASP.NET Core(Windows安装实践)
原文地址 https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/?view=aspnetcore-2.0&tabs= ...
- asp.net 错误页面自定义
在我们上网浏览信息的时候,总会有出现404页面的时候,在我们开发的时候也可以自定义这些页面.刚回这次项目中也使用到了,就在网上找到一些方法,今天就把这些方法重新写一遍加深记忆. 在项目的web.con ...
- c# BindingSource 类
1.引言 BindingSource组件是数据源和控件间的一座桥,同时提供了大量的API和Event供我们使用.使用这些API我们可以将Code与各种具体类型数据源进行解耦:使用这些Eve ...