Java NIO学习笔记一 Java NIO概述
Java NIO概述
Java NIO(新的IO)是Java的替代IO API(来自Java 1.4),这意味着替代标准的 java IO和java Networking API。Java NIO提供了与标准IO API不同的IO工作方式。
Java NIO由以下核心组件组成:
- 通道
- 缓冲区
- 选择器
除了Channel,Buffer 并Selector,Java NIO还有其他更多的类和组件。但是Channel,Buffer 和Selector构成了Java NIO API的核心。我认为,其他的组件,像 Pipe和FileLock只是结合三个核心组件一起使用的工具类。因此,本章我将重点介绍NIO概述中的这三个核心组件。
通道和缓冲区
通常,NIO中的所有IO都以一个通道开始。通道有点像流。数据从通道可以读入缓冲区。数据也可以从一个缓冲区写入通道。
在标准IO API中,你编码使用是字节流和字符流。在NIO中,你编码使用是通道和缓冲区。使用NIO读取数据,数据总是从通道读入缓冲区,或从缓冲区写入通道。
如图:
![]() |
| Java NIO:通道将数据读入缓冲区,缓冲区将数据写入通道 |
Channel和Buffer有几种类型。以下是通道在Java NIO 主要实现的列表:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
通过上面的实现可以看出,这些通道涵盖UDP + TCP网络IO和文件IO。
还有一些有趣的接口也伴随着这些类,但是为了方便理解,我将把它们放在Java NIO概述之外。将在相关的Java NIO教程的其他文本中进行说明。
下面是缓冲区Java NIO 中的核心实现的列表:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
这些Buffer覆盖了您可以通过IO发送的基本数据类型:byte,short,int,long,float,double和characters。Java NIO还具有一个MappedByteBuffer,是与内存映射文件配合使用的。
Java NIO:非阻塞IO
Java NIO支持执行非阻塞IO。例如,线程访问一个通道将数据读入到缓冲区。当通道将数据读入缓冲区时,线程还可以执行其他操作。一旦数据读入缓冲区,线程就可以继续处理它。线程执行将数据写入通道也是如此。
选择器
Java NIO还有一个新的概念“选择器”。选择器是一个能够监视事件的多个通道的对象(例如:打开连接,数据到达等等)。因此,单线程可以监视多个通道的数据。
一个选择器允许单个线程处理多个通道。如果您的应用程序有许多连接(通道)打开,但每个连接的流量都比较低,这是方便的。例如,在聊天服务器中。
如图:一个线程使用一个选择器来处理3个通道的:
![]() |
| Java NIO:A Thread uses a Selector to handle 3 Channel's |
注册一个通道来使用选择器。称之为 select()方法。该方法将阻塞,直到有一个注册通道的事件准备就绪。一旦方法有返回值,线程就可以处理这些事件。通道事件是传入连接,数据接收等
Java NIO学习笔记一 Java NIO概述的更多相关文章
- Java NIO 学习笔记(一)----概述,Channel/Buffer
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java IO学习笔记六:NIO到多路复用
作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...
- [原创]java WEB学习笔记51:国际化 概述,API 之 locale类,dataFormat类,numberFormat类, MessageFormat类,ResourceBundle 类
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Java基础学习笔记一 Java介绍
java语言概述 Java是sun公司开发的一门编程语言,目前被Oracle公司收购,编程语言就是用来编写软件的. Java的应用 开发QQ.迅雷程序(桌面应用软件) 淘宝.京东(互联网应用软件) 安 ...
- Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类
final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对 ...
- Android(java)学习笔记89:泛型概述和基本使用
package cn.itcast_01; import java.util.ArrayList; import java.util.Iterator; /* * ArrayList存储字符串并遍历 ...
- Android(java)学习笔记28:泛型概述和基本使用
1. 泛型的概述和基本使用: package cn.itcast_01; import java.util.ArrayList; import java.util.Iterator; /* * Arr ...
- Java基础学习笔记四 Java基础语法
数组 数组的需求 现在需要统计某公司员工的工资情况,例如计算平均工资.最高工资等.假设该公司有50名员工,用前面所学的知识完成,那么程序首先需要声明50个变量来分别记住每位员工的工资,这样做会显得很麻 ...
- Java基础学习笔记六 Java基础语法之类和ArrayList
引用数据类型 引用数据类型分类,提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类.我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner ...
随机推荐
- Linux下修改环境终端提示符
Linux修改环境变量PS1(命令行提示符),可以使用vi编辑/etc/bashrc或/etc/profile文件,在最后加上: export PS1='[\u@\h \W]\$ ' 即可,其中\u显 ...
- CSS背景图片常见属性设置
在CSS中,图片属性的设置是必不可少的,下面介绍一下常见的图片属性: 1)背景图片插入:background-image:url(位置及名称); //默认在父级元素内的左上角 2)背景平铺方式:ba ...
- 关于用jQuery的animate方法实现的动画在IE中失效的原因以及解决方法
这几天在学jQuery,本身还只是一个新手,写了一个简单的动画--圆形头像的缩放.本身是用Firefox进行调试的,一切进行的很顺利,缩放可以按照预期执行,结果拿到IE上去之后,发现缩放动画失效了.后 ...
- python——模块
一.导入模块 Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入.导入模块有一下几种方法: 1 import module 2 fr ...
- CSS3 制作网格动画效果
在线演示 源码下载
- FrameBuffer系列 之 一点资源
Iamonlyme的FrameBuffer编程实例http://download.csdn.net/detail/iamonlyme/6512955 light588的通过framebuffer直接写 ...
- linux 中的搜索命令
which 查看可执行文件的位置. whereis 查看文件位置. locate 配合数据库查看文件位置. find 实际搜索硬盘查询文件名称. grep 查找文件内容 一般不常用find命令,因为f ...
- Qtp自动测试工具(案例学习)
♣Qtp是什么? ♣测试用例网站 ♦注册与登录 ♦测试脚本 ◊录制/执行测试脚本 ◊分析录制的测试脚本 ◊执行.查看测试脚本 ♦建立检查点 ...
- get和post提交数据的区别
get是客户端向服务器索取数据的请求,设定的初衷是,客户端(浏览器)给服务器发送请求,然后服务器再返回给客户端其要求的数据. 那么为什么说get也能提交数据呢? 我们仔细理解第一句话“客户端(浏览器) ...
- Java核心技术 卷I chapter05 继承
2017年4月10日19:41:44 仅仅用于打好基础 1. 在Java中,所有的继承都是公有继承,而没有C++中的私有继承和保护继承! 2.关键字super的使用方法: (1) 子类中想调用父类中的 ...

