0. 介绍

  参考   关于Java IO与NIO知识都在这里   ,在其基础上进行修改与补充。


1. NIO介绍

  1.1 NIO 是什么

  Java NIO 是 java 1.4, 之后新出的一套IO接口.

  NIO中的N可以理解为Non-blocking,不单纯是New。

  1.2 NIO的特性/NIOIO区别

  1. IO是面向流的,NIO是面向缓冲区的。
  2. IO流是阻塞的,NIO流是不阻塞的。
  3. NIO有选择器,而IO没有。

  阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

  阻塞调用:是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
  非阻塞调用:指在不能立刻得到结果之前,该调用不会阻塞当前线程。

  1.3 读数据和写数据方式

  1. 从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。
  2. 从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。

  1.4 NIO核心组件简单介绍

  1. Channels
  2. Buffers
  3. Selectors

2. Buffer

  2.1 Buffer(缓冲区)介绍

  1. Java NIO Buffer用于和NIO Channel交互。我们从Channel中读取数据到Buffer里,从Buffer把数据写入到Channel;
  2. Buffer本质上就是一块内存区;

  2.2 Buffer 的属性

  capacity(容量):

  缓冲区的 capacity 表明可以储存在缓冲区中的最大数据容量。实际上,它指定了底层数组的大小 ,或者至少是指定了准许我们使用的底层数组的容量。一旦Buffer写满了就需要清空已读数据以便下次继续写入新的数据。

  position(位置):

  当写入数据到Buffer的时候需要选中一个确定的位置开始,默认初始化时这个位置position为0,一旦写入了数据比如一个字节,整型数据,那么position的值就会指向数据之后的一个单元,position最大可以到capacity-1。

  当从Buffer读取数据时,也需要从一个确定的位置开始。Buffer从写入模式变为读取模式时,position会归零,每次读取后,position向后移动。

  limit(限制):

  在写模式,limit的含义是我们所能写入的最大数据量。它等同于Buffer的容量。

  一旦切换到读模式,limit则代表我们所能读取的最大数据量,他的值等同于写模式下position的位置。

  数据读取的上限是Buffer中已有的数据,也就是limit的位置(原position所指的位置)。

   2.3 Buffer的常见方法

  mark() :

  记录当前标记,以便后来可以定位到此处

  0 <= mark <= position <= limit <= capacity

  reset():

  将position定位到mark处

  rewind()

  取消mark标记

  flip()

  flip()方法可以吧Buffer从写模式切换到读模式。调用flip()方法会把position归零,并设置limit为之前的position的值。 也就是说,现在position代表的是读取位置,limit标示的是已写入的数据位置。

  clear() :

  为写数据做好准备,相当于缓冲区刚分配时的状态
  将limit设置为capacity的值
  将position归零

  2.4 Buffer的使用方式/方法介绍

  分配缓冲区(Allocating a Buffer):

ByteBuffer buf = ByteBuffer.allocate();

  

  写入数据到缓冲区(Writing Data to a Buffer):

  方法一:从Channel中写数据到Buffer

int bytesRead = inChannel.read(buf); 

  方法二:通过put写数据

buf.put();

3. Channel

  3.1 介绍

  通常来说NIO中的所有IO都是从 Channel(通道) 开始的。

  从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。

  从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。

  数据读取和写入操作图示:

  3.2 channel与流的区别

  1. 通道可以读也可以写,流一般来说是单向的(只能读或者写,所以之前我们用流进行IO操作的时候需要分别创建一个输入流和一个输出流)。
  2. 通道可以异步读写。
  3. 通道总是基于缓冲区Buffer来读写。

  3.3 Java NIO中最重要的几个Channel的实现

  1. FileChannel: 用于文件的数据读写
  2. DatagramChannel: 用于UDP的数据读写
  3. SocketChannel: 用于TCP的数据读写,一般是客户端实现
  4. ServerSocketChannel: 允许我们监听TCP链接请求,每个请求会创建会一个SocketChannel,一般是服务器实现

  待补充。。。


4. Selector

  4.1 介绍

  Selector 一般称 为选择器 ,它是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写。如此可以实现单线程管理多个channels,也就是可以管理多个网络链接。

  使用Selector的好处在于: 使用更少的线程来就可以来处理通道了, 相比使用多个线程,避免了线程上下文切换带来的开销。

待补充。。。


NIO 学习笔记的更多相关文章

  1. Java NIO学习笔记

    Java NIO学习笔记 一 基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系统提供执 ...

  2. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

  3. Java NIO 学习笔记(七)----NIO/IO 的对比和总结

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  4. Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  5. Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  6. Java NIO 学习笔记(四)----文件通道和网络通道

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  7. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  8. Java NIO 学习笔记(二)----聚集和分散,通道到通道

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  9. Java NIO 学习笔记(一)----概述,Channel/Buffer

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  10. Java:NIO 学习笔记-3

    Java:NIO 学习笔记-3 根据 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 3. JAVA NIO 深入剖析 在讲解利用 NIO 实现通信架构之前,我们需要先来了解一下 NI ...

随机推荐

  1. Spring总结 3.AOP(xml)

    本随笔内容要点如下: 什么是AOP AOP术语解释 Spring中AOP的xml实现 一.什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.那什么是面向切 ...

  2. Qt5——从零开始的Hello World教程(Qt Creator)

    简单Qt教程 一.打开Qt Creator 本次的目的是用Qt Creator建立一个Hello World项目,在安装Qt之后,首先要打开Qt Creator. 就是它啦,打开后会显示如下页面. 二 ...

  3. 【IT笔试面试题整理】判断链表是否存在环路,并找出回路起点

    [试题描述]定义一个函数,输入一个链表,判断链表是否存在环路,并找出回路起点 Circular linked list: A (corrupt) linked list in which a node ...

  4. java8 Stream使用案例

    1. 原理 Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator. 原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执 ...

  5. 团队作业6——展示博客(alpha阶段)

    Deadline: 2018-5-9 10:00PM,以提交至班级博客时间为准. 5.10周四实验课将进行alpha阶段项目复审,请在5.10之前,根据以下要求,完成alpha版本的展示,并以此作为参 ...

  6. webpack4 自学笔记三(提取公用代码)

    全部的代码及笔记都可以在我的github上查看, 欢迎star:https://github.com/Jasonwang911/webpackStudyInit/tree/master/commonT ...

  7. UVa 442 Matrix Chain Multiplication(栈的应用)

    题目链接: https://cn.vjudge.net/problem/UVA-442 /* 问题 输入有括号表示优先级的矩阵链乘式子,计算该式进行的乘法次数之和 解题思路 栈的应用,直接忽视左括号, ...

  8. map映照容器(常用的使用方法总结)

    map映照容器的数据元素是由一个键值和一个映照数据组成的,键值和映照数据之间具有一一对应的关系.map与set集合容器一样,不允许插入的元素的键值重复. /*关于C++STL中map映照容器的学习,看 ...

  9. APIO 2018 游记

    上接CTSC 2018 游记 day1 早上大概八九点起来洗了个澡跑到隔壁寝发现 tj 还在??? 原来昨天晚上听错名字了... 下午一起去 wfj 王府井玩,陪李总逛逛奢侈品店... 走了两三个小时 ...

  10. 【转载】H5页面列表的无线滚动加载(前端分页)

    本代码基于Vue的架构 1.首先,要滚动的内容放在一个‘id=box’ 的div里,对div进行scroll事件的监听 <div id="box" class="m ...