NIO(一)——Buffer

  • NIO简介
    • NIO即New IO,是用来代替标准IO的,提供了与标准IO完全不同传输方式。
    • 核心:通道(Channel)和缓冲区(Buffer)和选择器(Selectors),Channel负责传输,Buffer负责存储
  • 与标准IO的区别
    • 标准IO是面向字节流的,NIO是面向缓冲区的
    • 标准IO是阻塞IO,NIO是非阻塞IO
  1. 当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。

NIO具有选择器Selectors

  1. 选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道
  • 缓冲区Buffer
      • 在Java NIO中负责数据的存取。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。
      • 根据数据类型的不同,提供了不同类型的缓冲区(boolean除外):
    1. ByteBuffer
    2. ShortBuffer
    3. IntBuffer
    4. LongBuffer
    5. FloatBuffer
    6. DoubleBuffer
    7. CharBuffer
  • 上述缓冲区的管理方式几乎一致,通过allocate()获取缓冲区:
  1. ByteBuffer buf = ByteBuffer.allocate(1024);

缓冲区存储数据的两个核心方法:

  1. put():存数据到缓冲区
  2. get():从缓冲区取数据

缓冲区中的核心属性:

  1. capacity:容量,表示缓冲区中最大存储数据的容量,一旦声明不可改变
  2. limit:界限,表示缓存区冲可以操作数据的大小。limit后的数据不能进行读写(读和写操作含义不同)
  3. position:位置,表示缓冲区中正在操作的数据的位置
  4. mark:标记,表示记录当前position的位置,可以通过reset()恢复到mark的位置
  5. 0<=mark<=position<=limit<=capacity
  • 方法:
    • flid()方法:在切换读写模式的时候必须调用flid()方法
    1. buf.flip();
    2. flip()方法:
                  public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
                            return this;
                        }
  • rewind()方法:
  1. 可重复读数据,将position置0,limit不变
  2.   public final Buffer rewind() {
    position = 0;
    mark = -1;
    return this;
    }

clear()与compact()方法:

  • 一旦读完缓冲区中的数据,需要让缓冲区准备好再次被写入。可以通过clear()或compact方法来完成。
  • 如果调用的是clear()方法,position将被置0,limit被设置为capacity的值。即缓冲区被清空。但缓冲区中的数据并未被清除。
  • 如果缓冲区中有一些未读的数据,调用clean()方法,数据将“被遗忘”。
  • 如果缓冲区中有一些未读的数据,且后续还需要这些数据,但此时想先写些数据,就使用compact()方法。compact()方法将所有未读的数据拷贝到Buffer起始处,然后将position设到最后一个未读元素后面,limit=capacity。
  •    public final Buffer clear() {
    position = 0;
    limit = capacity;
    mark = -1;
    return this;
    }
       public abstract ByteBuffer compact();
    • 直接缓冲区与非直接缓冲区:
    1. 非直接缓冲区:通过allocate()方法分配缓冲区,将缓冲区建立在JVM内存中
    2.  public static ByteBuffer allocate(int capacity) {
      if (capacity < 0)
      throw new IllegalArgumentException();
      return new HeapByteBuffer(capacity, capacity);
      }
      HeapByteBuffer(int cap, int lim) {
      super(-1, 0, lim, cap, new byte[cap], 0);
      }
      ByteBuffer(int mark, int pos, int lim, int cap, byte[] hb, int offset){
      super(mark, pos, lim, cap);
      this.hb = hb;
      this.offset = offset;
      }
    • 直接缓冲区:
    • 通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率        
     public static ByteBuffer allocateDirect(int capacity) {
    return new DirectByteBuffer(capacity);
    }
     DirectByteBuffer(int cap) {
    super(-1, 0, cap, cap);
    boolean pa = VM.isDirectMemoryPageAligned();
         //调用直接内存方法进行分配
    int ps = Bits.pageSize();
    long size = Math.max(1L, (long)cap + (pa ? ps : 0));
    Bits.reserveMemory(size, cap); long base = 0;
    try {
    base = unsafe.allocateMemory(size);
    } catch (OutOfMemoryError x) {
    Bits.unreserveMemory(size, cap);
    throw x;
    }
    unsafe.setMemory(base, size, (byte) 0);
    if (pa && (base % ps != 0)) {
    address = base + ps - (base & (ps - 1));
    } else {
    address = base;
    }
    cleaner = Cleaner.create(this, new Deallocator(base, size, cap));
    att = null;
    }

NIO(一)——缓冲区Buffer的更多相关文章

  1. NIO之缓冲区(Buffer)的数据存取

    缓冲区(Buffer) 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通道 ...

  2. nio之缓冲区(Buffer)理解

    一.缓冲区简介 Nio中的 Buffer 是用于存储特定基础类型的一个容器.为了能熟练的使用 Nio中的各种 Buffer , 我们需要理解 Buffer 中的 三个重要 的属性. 1. capaci ...

  3. Java NIO之缓冲区Buffer

    Java NIO的核心部件: Buffer Channel Selector Buffer 是一个数组,但具有内部状态.如下4个索引: capacity:总容量 position:下一个要读取/写入的 ...

  4. Java NIO流 -- 缓冲区(Buffer,ByteBuffer)

    用来定义缓冲区的所有类都以Buffer类为基类,Buffer定义了缓冲区的基本特征. 直接子类: ByteBuffer 用来存储byte类型的缓冲区,可以在这种缓冲区中存储任意其他基本类型的二进制值( ...

  5. Java NIO -- 缓冲区(Buffer)的数据存取

    缓冲区(Buffer): 一个用于特定基本数据类型的容器.由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类.Java NIO 中的 Buffer 主要用于与 NIO 通道进行 ...

  6. JAVA NIO缓冲区(Buffer)------ByteBuffer常用方法

    参考:https://blog.csdn.net/xialong_927/article/details/81044759 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I ...

  7. NIO(一):Buffer缓冲区

    一.NIO与IO: IO:  一般泛指进行input/output操作(读写操作),Java IO其核心是字符流(inputstream/outputstream)和字节流(reader/writer ...

  8. Java NIO 缓冲区 Buffer

    缓冲区 Buffer 是 Java NIO 中一个核心概念,它是一个线性结构,容量有限,存放原始类型数据(boolean 除外)的容器. 1. Buffer 中可以存放的数据类型 java.nio.B ...

  9. Java-NIO(二):缓冲区(Buffer)的数据存取

    缓冲区(Buffer): 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通 ...

随机推荐

  1. mac os x下的一些小技巧

    1显示swap空间: sysctl vm.swapusage 其中sysctl中有很多可以控制和查看的项,可以通过sysctl -A列举,另外可以通过man sysctl来查看. 而实际swap文件和 ...

  2. windows下ruby使用tk编程的方法

    我们知道tcl/tk是一个小巧的脚本语言,tk对于跨平台的CUI编程提供了很好的移植性,我们来一下windows下ruby中要想使用tk开发需要做哪些工作: 1 gem query -r tk #选择 ...

  3. RecyclerView 与 Scrollview 搭配使用的两个坑

    RecyclerView & Scrollview & wrap_content RecyclerView wrap_content 用android.support.v4.widge ...

  4. sxoi爆炸祭

    好吧,纯粹是去玩玩的,我这么一个弱省的蒟蒻,进队纯粹是开玩笑.... Day0 去五中试机,感觉电脑手感不错,打了半个线段树的板子才发现试机要在自己的电脑上试,然后我无奈的搬东西(从26号搬到2号), ...

  5. JSON 的含义?

    JSON 的全称是 JavaScript Object Notation,是一种轻量级的数据交换格式.JS ON 与 XML 具有相同的特性,例如易于人编写和阅读,易于机器生成和解析.但是 JSON ...

  6. mysql distinct field1,field2,field3, .... from table

    mysql distinct field1,field2,field3, .... from table 我们知道 这样的sql可以去掉重复项 (field1的重复项); select distinc ...

  7. .Net MVC5异步请求Entity Framework 无限循环解决方法

    .Net MVC5异步请求Entity Framework 无限循环解决方法 Entity Framework 存在一对多.多对多之间的关系,相互依赖,在返回JSON数据时往往会出现相互引用造成的无限 ...

  8. (七):C++分布式实时应用框架 2.0

    C++分布式实时应用框架 2.0 技术交流合作QQ群:436466587 欢迎讨论交流 上一篇:(六):大型项目容器化改造 版权声明:本文版权及所用技术归属smartguys团队所有,对于抄袭,非经同 ...

  9. SVD的概念以及应用

    第十四章 利用SVD简化数据 一.引言 SVD的全称是奇异值分解,SVD的作用是它能够将高维的数据空间映射到低维的数据空间,实现数据约减和去除噪声的功能. SVD的特点主要有以下几个方面: 1.它的优 ...

  10. 图片滚动(UP)的JS代码详解(offsetTop、scrollTop、offsetHeigh)【转】

    源地址 信息技术教材配套的光盘里有一段设置图片滚动的JS代码,与网络上差不多,实现思路:一个设定高度并且隐藏超出它高度的内容的容器demo,里面放demo1和 demo2,demo1是滚动内容,dem ...