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

目录

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. HDU5475

    An easy problem Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  2. [html5] 学习笔记-改良的input元素种类

    在html5中,大幅度增加与改良了input元素的种类,可以简单的使用这些元素来实现之前需要JS脚本来实现的功能. 1.url类型.email类型.date类型.time类型.datetime类型.d ...

  3. 5种IE hasLayoutt的属性及其值

    hasLayout 是Windows  Internet  Explore 渲染引擎的一个内部组成部分.在 Internet Explore 中,一个元素要么自己对自身内容进行计算大小和组织,要么依赖 ...

  4. 关于data-xxx属性大小写不敏感,不识别大写的几点总结

    1.所有标签属性,没有大小写区分,都是小写,如:data-userID,在输出后会变成data-userid,前者只能获取到'undefined'. 2.dataset 自动把 - 转换为驼峰.类似的 ...

  5. [UWP]依赖属性2:使用依赖属性

    5. 完整的自定义依赖属性 5.1 定义 /// <summary> /// 标识 Title 依赖属性. /// </summary> public static reado ...

  6. [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 ...

  7. 详解Google Chrome浏览器(操作篇)(一)

    开篇概述 在上篇博客中详解Google Chrome浏览器(理论篇)一文中,主要讲解了Chrome 搜索引擎使用.Chrome安装和基本操作.Chrome 基本架构.多线程等原理性问题,这篇将重点讲解 ...

  8. Python单元测试——深入理解unittest

    单元测试的重要性就不多说了,可恶的是python中有太多的单元测试框架和工具,什么unittest, testtools, subunit, coverage, testrepository, nos ...

  9. 前端跨域方案-跨域请求代理(node服务)

    前端开发人员在本地搭建node服务,调用接口首先走本地服务,然后转发到api站点,node服务代码如下: var express = require('express'), request = req ...

  10. storm 1.0版本滑动窗口的实现及原理

    滑动窗口在监控和统计应用的场景比较广泛,比如每隔一段时间(10s)统计最近30s的请求量或者异常次数,根据请求或者异常次数采取相应措施.在storm1.0版本之前,没有提供关于滑动窗口的实现,需要开发 ...