定义:

NIO:是从jdk1.4提出的,本意是New IO(相对于传统的IO),也叫 No Blocked IO(只相对于网络IO),它的出现弥补传统IO的不足,提出了更加高效的方式。

NIO对于网络IO而言:

jdk1.4:采用了基于select/poll的多路复用IO模型。
jdk1.5及以上:采用了基于epoll的多路复用IO模型。

IO模型可查看:详解Unix5种IO模型

NIO对于文件IO而言:

NIO对基于文件的IO还是阻塞模型的IO。只有基于网络IO才是非阻塞的。

NIO的新特性:

  1. 基于通道(Channel)和缓冲区(Buffer)操作
  • 通道(Channel):一个新的、原始的IO抽象。
  • 缓冲区支持(Buffer):为所有的原始类型提供缓冲区支持。也就是说NIO是强制基于通道和缓冲区操作的。
  • 具体操作:数据从通道读到缓冲区,数据从缓冲区写入通道(用户进程角度)。
  1. 非阻塞(针对网络IO)
  • 提供多路复用、非阻塞的IO操作,即当前线程从通道读取数组到缓冲区时,或者把缓冲区数据写入到通道时,线程依然可以进行其他事情。
  1. 选择器(selectors)(针对网络IO)
  • 用户监听多个通道的事件,如:连接打开,数据到达等,单个线程可监听多个数据通道。
  1. 其他
  • 提供字符集编码、解码解决方案:java.nio.Charset。
  • 支持锁和内存映射文件的文件访问接口。

核心组件:

  • 通道(Channel):Java NIO的数据来源,可以是网络,也可以是本地磁盘。表示打开到IO设备(文件、套接字)的连接。
  • 缓冲区(Buffer):数据读写的中转区。用于容纳数据。
  • 选择器(Selectors):异步IO的核心类,可以实现异步非阻塞IO,一个Selectors可以管理多个通道Channel。

一个复制文件的小demo:

/*** @author YeHaocong* @decription 一个NIO的Demo,完成对文件的复制* @Date 2020/5/18 18:52*/public class NIOFirstDemo {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("test_nio1.txt");FileOutputStream fos  = new FileOutputStream("test_nio1_cp.txt")){//获取通道,连接源节点和目标节点,通道本身不存储任何数据,因此需要缓冲区配合传输。FileChannel fisChannel = fis.getChannel();//获取通道,连接源节点和目标节点,通道本身不存储任何数据,因此需要缓冲区配合传输。FileChannel fosChannel = fos.getChannel();//创建缓冲区,并分配1024字节。ByteBuffer byteBuffer = ByteBuffer.allocate(1024);//把文件的数据通过通道传输写到ByteBuffer缓冲区中fisChannel.read(byteBuffer);//把缓冲区该为读模式。byteBuffer.flip();//读取byteBuffer里面的数据通过输出流通道写到文件中fosChannel.write(byteBuffer);//清空缓冲区byteBuffer.clear();//关闭通道与流fisChannel.close();fosChannel.close();fis.close();fos.close();}catch (IOException e){}}
}

IO和NIO的区别:

类型 面向操作域 处理数据 IO阻塞/非阻塞(基于网络IO)
Java IO 可以面向缓冲区,也可以直接面向数据源,使用流进行传输 没有缓冲区的话是直接读取字节或者字符,并且无法前后移动数据流中的数据 阻塞:当一个线程在读/写时,当数据完全被读取/写入或者数据没有准备好时,线程不能做其他任务,只能一直阻塞等待,知道数据准备好后才能继续。
Java NIO 强制通道和缓冲区 先读取数据到缓冲区,并且可以前后移动数据量中的数据 非阻塞:当一个线程在读/写时,当数据完全被读取/写入或者数据没有准备好时,线程可以做其他任务(控制其他通道),知道数据准备好后再切换回该通道。继续读取、写入。

Java NIO学习篇之NIO的基本认识相关推荐

  1. Java NIO学习篇之直接缓冲区和非直接缓冲区

    定义 以上是书深入理解java虚拟机对直接内存的描述.直接缓冲区用的就是直接内存. java nio字节缓冲区要么是直接的,要么是非直接的.如果为直接字节缓冲区,则java虚拟机会尽最大努力直接在此缓 ...

  2. Java NIO学习篇之通道FileChannel详解

    定义: FileChannel是Java NIO对应于磁盘等存储设备文件操作的通道. 常用API详解: 获取FileChannel的API /** * 打开一个与文件的连接通道,用于进行文件操作. * ...

  3. Java NIO学习篇之缓冲区ByteBuffer详解

    定义: ByteBuffer是Buffer的实现类之一,是一个通用的缓冲区,功能要比其他缓冲区子类多.支持直接内存.是一个抽象类.子类实现是HeapByteBuffer(非直接缓冲区子类),Direc ...

  4. JAVA NIO学习一:NIO简介、NIOIO的主要区别

    在前面学习了IO之后,今天我们开始进入NIO学习环节,首先我们会NIO做一个简单的介绍,让大家认识NIO,然后会和IO进行一个对比认识进行区分.好了,下面我们就开始学习: 一.NIO简介 1.概述 从 ...

  5. Java NIO学习篇之缓冲区CharSet详解

    定义: CharSet是对java nio编码解码的解决方案,专门负责字符的编码和解码. 编码:字符数组.字符串 ===> 字节数组. 解码:字节数组 ==> 字符数组.字符串 API详解 ...

  6. Java NIO学习篇之通道Channel详解

    定义: Channel:通道,运输的介质,可以大致比喻成铁路的铁轨,连接着两个车站,而channel用于打开与IO设备的连接,比如磁盘,套接字等. 通道使用完需要关闭. 与传统IO的Stream比较: ...

  7. Java NIO学习篇之缓冲区Buffer详解

    定义 缓冲区Buffer在java nio中负责数据的存储,缓冲区就是数组,用于存储不同类型数据的数组. jdk为java七大基本类型数据都准备了响应的缓冲区(boolean值除外): ByteBuf ...

  8. Java NIO学习篇之PosixFilePermission详解

    定义: PosixFilePermission是一个枚举类,代表着文件的基本权限. public enum PosixFilePermission {/*** 文件所有者的读权限*/OWNER_REA ...

  9. Java NIO学习篇之StandardOpenOption详解

    定义: StandardOpenOption是一个枚举类,代表着文件连接时的标准选项.通常可以多个选项一起使用. public enum StandardOpenOption implements O ...

最新文章

  1. 2018人工智能前沿报告:深度学习的应用和价值
  2. 关于javascript数据存储机制的一个案例。
  3. linux+python+djiango+mysql编译安装学习笔记
  4. 【知识库专访】亲加CTO郝飞:直播技术架构解密与优化之道
  5. Java怎么学?实用的学习路线图分享
  6. eclipse安装、使用hibernate插件方法
  7. [Linux]几个armhf的ubuntu源
  8. jsp中给div加背景_web前端入门到实战:详解css3如何给背景图片加颜色遮罩
  9. 跟我学习Storm_Storm基本架构
  10. mysql 数据表中查找重复记录(条数)
  11. Gradle在Android中的基本使用
  12. ArcMAP栅格数据裁剪小技巧
  13. 《惢客创业日记》2019.01.18(周五)想象力害死人呀!
  14. 免费的银行联行号查询/接口
  15. 淘宝导航css相关说明
  16. 【图解HTTP】——Web的攻击技术
  17. Photoshop入门学习
  18. 图计算发展简史(1)
  19. 计讯物联环保数采仪全系列产品为节能降耗减碳贡献绿色力量
  20. 计算机表演赛qq输入法,25届计算机表演赛命题搜索之中国文学篇.doc

热门文章

  1. Hive案例:统计单词个数
  2. ES6学习笔记03:变量的解构赋值
  3. 【BZOJ4197】寿司晚宴,状态压缩DP
  4. 18.外部相机校准——旋转(Rotation),R是什么样子的,绕Z轴旋转的例子,齐次坐标旋转_2
  5. apf svg matlab,【涨知识】APF和SVG的区别与联系
  6. 2017.10.23 卡牌游戏 失败总结
  7. Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(4) - 32位EFLAGS - 状态标志与控制标志
  8. 8.0.22Mysql的详细安装
  9. php mysql_fetch_array 不要0_1_php – mysql_fetch_array不适用于1行查询结果
  10. 使用 Subversion (SVN) 的方式来访问 Github