离上次发布文章已过去好几个月,说好的积累和分享都烟消云散。似乎忙碌从未终止过,加班成为常态,甚至阅读都需要更琐碎的时间。

目录

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(一、概述)的更多相关文章

  1. AJPFX关于Java NIO的概述总结

    Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Sel ...

  2. 攻破JAVA NIO技术壁垒

    转载自攻破JAVA NIO技术壁垒 概述 NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector.传统IO基于字节流和字符流进行操作,而NIO基于Channel和 ...

  3. JDK10都发布了,nio你了解多少?

    前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 本来我预想是先来回顾一下传统的IO模式的,将传统的IO模式的相关类理清楚(因为IO的类很多). 但是,发现在整理 ...

  4. [Java] I/O底层原理之三:NIO

    本篇文章参考自并发编程网 一.NIO 的概述 NIO 由以下几个核心组成 Channels Buffers Selectors 选择器用于监听多个通道的事件(如:链接打开.数据达到),单个线程可以监听 ...

  5. Java基础--IO

    1,流的认识和分类 2,Java种处理流的IO类架构 3,字节流和字符流转换 4,NIO的概述 5,Java IO关闭资源 1,流的认识和分类 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的 ...

  6. Java NIO概述

    Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然 Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Se ...

  7. Java NIO:NIO概述

    Java NIO:NIO概述 在上一篇博文中讲述了几种IO模型,现在我们开始进入Java NIO编程主题.NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题.本文下面分别从Java ...

  8. 转:Java NIO系列教程(一)Java NIO 概述

    Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Sel ...

  9. [翻译]java nio 概述

    原文地址:http://tutorials.jenkov.com/java-nio/overview.html java NIO 包含一下核心内容: Channels Buffers Selector ...

  10. java的nio之:java的nio系列教程之概述

    一:java的nio的核心组件?Java NIO 由以下几个核心部分组成: ==>Channels ==>Buffers ==>Selectors 虽然Java NIO 中除此之外还 ...

随机推荐

  1. 纯css实现轮播图

    轮播图的实现原理其实是比较简单的 举个例子 <div class="main"> <div class="div-main"></ ...

  2. 用Hashcat每秒计算1.4亿个密码,破解隔壁WIFI密码

    Hashcat是啥 Hashcat是什么呢?Hashcat是当前最强大的开源密码恢复工具,你可以访问Hashcat.net网站来了解这款工具的详细情况.本质上,Hashcat 3.0是一款高级密码恢复 ...

  3. css浮动(float,clear)

    1. 以div元素布局为例,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流,是指标准流中的div. 无论多么复杂的布局,其基本出发点均是:“如何在一行显示多个div元素”,显然标准 ...

  4. 如何使用Babel将ES6转码为ES5?

    一.前言: 当我们还在沉迷于ES5的时候,殊不知ES6早就已经发布几年了.时代在进步,WEB前端技术也在日新月异,是时候做些改变了! ECMAScript 6(ES6)的发展速度非常之快,但现代浏览器 ...

  5. 下一个项目为什么要用 SLF4J

    阿里巴巴 Java 开发手册 前几天阿里巴巴在云栖社区首次公开阿里官方Java代码规范标准,就是一个PDF手册,有命名规范,让你知道自己原来取的每一个类名.变量名都是烂名字,真替你家未来孩子担心:有集 ...

  6. java-6数组

    一. 请编写一个程序将一个整数转换为汉字读法字符串.比如"1123"转换为"一千一百二十三".更进一步,能否将数字表示的金额改为"汉字表达?比如将&q ...

  7. HTML中的a标签实现点击下载

    通常在咱们写项目的时候会遇到上传下载什么的,在上传完文件后会把文件的路径保存到数据库里以便下载,如果想不通过后台直接下载的话,可以把文件路径给a标签的属性href: <a href=" ...

  8. Input file 文本框美化

    HTML原生的input file 上传按钮有多(无)不(力)漂(吐)亮(槽)我就不多说了.大家几乎在项目中都会有遇到图片.等文件需要上传的地方,好看的文件上传按钮会使人身心愉悦(我瞎说的).好了不多 ...

  9. BZOJ 1103: [POI2007]大都市meg(dfs序,树状数组)

    本来还想链剖的,结果才发现能直接树状数组的= = 记录遍历到达点与退出点的时间,然后一开始每个到达时间+1,退出时间-1,置为公路就-1,+1,询问直接点1到该点到达时间求和就行了- - CODE: ...

  10. 自行搭建私有云ownCloud,启用SSL,其他配置

    ownCloud简介 ownCloud(官网)是一款开源的私有云框架,可以通过它实现个人网盘的功能,如果拥有一个性能不错的VPS,那么就可以摆脱奇慢无比的百度云等网盘啦!我花了大约一天的时间总算搭好了 ...