• NIO 学习笔记


     


     

    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(10);

      

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

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

    int bytesRead = inChannel.read(buf); 

     

      方法二:通过put写数据

    buf.put(10);

     


     

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

    待补充。。。


    且将新火试新茶,诗酒趁年华。
  • 相关阅读:
    如何学习一项新技术呢?
    开发人员如何构建自己的学习笔记系统
    Stream流之List、Integer[]、int[]相互转化
    图解LinkedHashMap原理
    java 手动实现单链表(尾插法和头插法)
    为什么你学不会递归?刷题几个月,告别递归,谈谈我的经验
    谈谈限流算法的几种实现
    使用LinkedHashMap实现一个简易的LRU缓存
    Java深拷贝和浅拷贝
    Excel两列求差集和并集的实现
  • 原文地址:https://www.cnblogs.com/share23/p/9635001.html
Copyright © 2020-2023  润新知