NIO(一、概述)
离上次发布文章已过去好几个月,说好的积累和分享都烟消云散。似乎忙碌从未终止过,加班成为常态,甚至阅读都需要更琐碎的时间。
目录
NIO(一、概述)
NIO(二、Buffer)
NIO(三、Channel)
NIO(四、Selector)
概述
JavaNIO(new IO),1.4版本引入的新的IO API。从表现来看,NIO优化了更多的应用场景。在1.7版本NIO做了一次升级,引入了更多的特性,例如AIO
说起NIO,似乎有很多相关的概念,诸如同步(/异步)阻塞(/非阻塞),Reactor(/Proactor)模式,把这些概念清晰明白的说出来并非一日之功。
与IO有何区别
这是某文件的一段文本
Hello
World
简单的IO操作就像下面这样:
InputStream input = new FileInputStream(dir);
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line1 = reader.readLine(); //"Hello"
String line2 = reader.readLine(); //"World"
那么NIO操作简单事例:
FileInputStream fis = new FileInputStream(dir);
//创建通道
FileChannel channel = fis.getChannel();
//分配缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);
String txt = Charset.forName("utf-8").newDecoder().decode(buffer).toString();
可以肯定的是,两种工作方式并不同。
比较上面两份代码,我们会发现,IO的操作是直接操作流的,而NIO却是操作缓冲区,相比较操作流,操作缓冲区将会更加自由灵活。
此外,需要注意的是,使用Java IO时,当执行 reader.readLine() 时候,意味着当前的线程呈阻塞状态,直到该行读取结束。

显然,NIO的选择器允许单独的线程来管理多个通道,尽力利用一个线程的资源处理多个连接,这就是多路复用。因为这个机制,线程在空闲的状态下,不会因为某个通道等待而阻塞另一个通道。当然,NIO同样也提供了Asynchronous IO(异步IO),不论数据从通道到缓冲区还是缓冲区到通道,任何一个空闲的时候,线程都可以做其他事情。

那么什么时候使用NIO呢?做一个比喻,假如线程是一个水桶的话,你去一个水龙头接水,那么此时你可以使用Java IO,但如果水龙头的水时有时无不说,水流还小,那么你可能会用这个水桶同时接多个水龙头,那么这时候,你使用的就应该是Java NIO。
组成部分
- Channels
- Buffers
- Selectors
NIO API最核心就是这三个部分,Channels意指通道,数据从通道(Channel)开始,流入缓冲区(Buffer),或者从缓冲区流入通道,选择器(Selector)存在的意义便是监听多个通道的事件,让线程处理。
(未完待续!)
NIO(一、概述)的更多相关文章
- AJPFX关于Java NIO的概述总结
Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Sel ...
- 攻破JAVA NIO技术壁垒
转载自攻破JAVA NIO技术壁垒 概述 NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector.传统IO基于字节流和字符流进行操作,而NIO基于Channel和 ...
- JDK10都发布了,nio你了解多少?
前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 本来我预想是先来回顾一下传统的IO模式的,将传统的IO模式的相关类理清楚(因为IO的类很多). 但是,发现在整理 ...
- [Java] I/O底层原理之三:NIO
本篇文章参考自并发编程网 一.NIO 的概述 NIO 由以下几个核心组成 Channels Buffers Selectors 选择器用于监听多个通道的事件(如:链接打开.数据达到),单个线程可以监听 ...
- Java基础--IO
1,流的认识和分类 2,Java种处理流的IO类架构 3,字节流和字符流转换 4,NIO的概述 5,Java IO关闭资源 1,流的认识和分类 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的 ...
- Java NIO概述
Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然 Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Se ...
- Java NIO:NIO概述
Java NIO:NIO概述 在上一篇博文中讲述了几种IO模型,现在我们开始进入Java NIO编程主题.NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题.本文下面分别从Java ...
- 转:Java NIO系列教程(一)Java NIO 概述
Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Sel ...
- [翻译]java nio 概述
原文地址:http://tutorials.jenkov.com/java-nio/overview.html java NIO 包含一下核心内容: Channels Buffers Selector ...
- java的nio之:java的nio系列教程之概述
一:java的nio的核心组件?Java NIO 由以下几个核心部分组成: ==>Channels ==>Buffers ==>Selectors 虽然Java NIO 中除此之外还 ...
随机推荐
- HDU5475
An easy problem Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- [html5] 学习笔记-改良的input元素种类
在html5中,大幅度增加与改良了input元素的种类,可以简单的使用这些元素来实现之前需要JS脚本来实现的功能. 1.url类型.email类型.date类型.time类型.datetime类型.d ...
- 5种IE hasLayoutt的属性及其值
hasLayout 是Windows Internet Explore 渲染引擎的一个内部组成部分.在 Internet Explore 中,一个元素要么自己对自身内容进行计算大小和组织,要么依赖 ...
- 关于data-xxx属性大小写不敏感,不识别大写的几点总结
1.所有标签属性,没有大小写区分,都是小写,如:data-userID,在输出后会变成data-userid,前者只能获取到'undefined'. 2.dataset 自动把 - 转换为驼峰.类似的 ...
- [UWP]依赖属性2:使用依赖属性
5. 完整的自定义依赖属性 5.1 定义 /// <summary> /// 标识 Title 依赖属性. /// </summary> public static reado ...
- [Android ADB] An auto-input method for Android and Windows
The Valentine's Day is coming. Here is an auto-input method and you may use it to send multiple word ...
- 详解Google Chrome浏览器(操作篇)(一)
开篇概述 在上篇博客中详解Google Chrome浏览器(理论篇)一文中,主要讲解了Chrome 搜索引擎使用.Chrome安装和基本操作.Chrome 基本架构.多线程等原理性问题,这篇将重点讲解 ...
- Python单元测试——深入理解unittest
单元测试的重要性就不多说了,可恶的是python中有太多的单元测试框架和工具,什么unittest, testtools, subunit, coverage, testrepository, nos ...
- 前端跨域方案-跨域请求代理(node服务)
前端开发人员在本地搭建node服务,调用接口首先走本地服务,然后转发到api站点,node服务代码如下: var express = require('express'), request = req ...
- storm 1.0版本滑动窗口的实现及原理
滑动窗口在监控和统计应用的场景比较广泛,比如每隔一段时间(10s)统计最近30s的请求量或者异常次数,根据请求或者异常次数采取相应措施.在storm1.0版本之前,没有提供关于滑动窗口的实现,需要开发 ...