ByteBuffer 在NIO的作用

Java SE4 开始引入Java NIO,相比较于老的IO,更加依赖底层实现。引入通道(Channels),选择器(selector),缓冲(Buffers).都更加接近操作系统执行I/O的方式.所以速度更快。

NIO 是非阻塞IO,非阻塞IO的实现是基于事件的,选择器定义了一个IO通道,程序继续运行。选择器上发生事件时,会唤醒选择器并执行相应动作。IO是阻塞IO,面向流操作,顺序读写,对于小文件序列化的读写有优势。nio是面向缓冲器,对数据的偏移支持比较好。

本文提到的ByteBuffer就是缓冲器,负责与通道进行数据交换。缓冲器总共有ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBuffer.

ByteBuffer的重要属性

Buffer 基类

属性

缓冲器都继承了Buffer类,Buffer是一个固定大小的数据容器。除了存储内容之外,还有三个重要的属性。

  • capacity buffer中元素总数

  • position 写模式下就是下一个元素的index,读模式就是当前元素index

  • limit 是不应该被读/写的第一个元素index。写模式时就是capacity,读模式则是下一个元素的index.如下图:图片来自http://javapapers.com/java/java-nio-buffer/

方法

  • flip

    一般是切换到读操作。或者是为写操作准备一个新的序列
  public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }

eg.重复向一个ByteBuffer写数据的时候,赋值完毕,必须要flip.开始一个新的新序列,否则position会等于limit,返回空值

public static void main(String[] args) {
        byte[] bytes1=new byte[]{1, 6, 3};
        ByteBuffer buffer =fromByteArray(bytes1);
        System.out.println(buffer);
        byte[] bytes2 =new byte[]{1,2,3};
        ByteBuffer buffer2=fromByteArray(bytes2);
        System.out.println(buffer2);
    }

    /**
     * If you are building up a ByteBuffer by repeatedly writing into it, and then want to give it away, you must remember to flip() it.
     * If we did not flip() it, the returned ByteBuffer would be empty because the position would be equal to the limit.
     * @param bytes
     * @return
     */
    public static ByteBuffer fromByteArray(byte[] bytes) {
        final ByteBuffer ret = ByteBuffer.wrap(new byte[bytes.length]);

        ret.put(bytes);
        ret.flip();

        return ret;
    } 
  • rewind

rewind倒回,将position 设置为0,重新读取

 public final Buffer rewind() {
        position = 0;
        mark = -1;
        return this;
    }
  • clear

    clear 并没有真正的清除数据,将position设置为0,limit设置为capacity.
  public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }

ByteBuffer

ByteBuffer 相比较其他的缓冲器有些区别

  • 可以分配直接缓冲区

    直接缓冲区,JVM会尽可能的直接在此缓冲区执行本机IO操作。避免与中间缓冲区交互

  • 可以通过mapping将文件区域直接映射到内存来创建、

  • 访问二进制数据

参考

http://www.javaworld.com/article/2078654/java-se/java-se-five-ways-to-maximize-java-nio-and-nio-2.html

http://javapapers.com/java/java-nio-buffer/

https://docs.oracle.com/javase/7/docs/api/java/nio/package-summary.html#buffers

JDK 源码学习——ByteBuffer的更多相关文章

  1. JDK源码学习--String篇(二) 关于String采用final修饰的思考

    JDK源码学习String篇中,有一处错误,String类用final[不能被改变的]修饰,而我却写成静态的,感谢CTO-淼淼的指正. 风一样的码农提出的String为何采用final的设计,阅读JD ...

  2. JDK源码学习系列05----LinkedList

                                             JDK源码学习系列05----LinkedList 1.LinkedList简介 LinkedList是基于双向链表实 ...

  3. JDK源码学习系列04----ArrayList

                                                                             JDK源码学习系列04----ArrayList 1. ...

  4. JDK源码学习系列03----StringBuffer+StringBuilder

                         JDK源码学习系列03----StringBuffer+StringBuilder 由于前面学习了StringBuffer和StringBuilder的父类A ...

  5. JDK源码学习系列02----AbstractStringBuilder

     JDK源码学习系列02----AbstractStringBuilder 因为看StringBuffer 和 StringBuilder 的源码时发现两者都继承了AbstractStringBuil ...

  6. JDK源码学习系列01----String

                                                     JDK源码学习系列01----String 写在最前面: 这是我JDK源码学习系列的第一篇博文,我知道 ...

  7. JDK源码学习笔记——LinkedHashMap

    HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序. LinkedHashMap保证了元素迭代的顺序.该迭代顺序可以是插入顺序或者是访问顺序.通过维护一个 ...

  8. JDK源码阅读-ByteBuffer

    本文转载自JDK源码阅读-ByteBuffer 导语 Buffer是Java NIO中对于缓冲区的封装.在Java BIO中,所有的读写API,都是直接使用byte数组作为缓冲区的,简单直接.但是在J ...

  9. JDK源码学习笔记——String

    1.学习jdk源码,从以下几个方面入手: 类定义(继承,实现接口等) 全局变量 方法 内部类 2.hashCode private int hash; public int hashCode() { ...

随机推荐

  1. Git + Maven + Jenkins 实现分布式部署

    一.安装 和 准备工作 我们选择了用 Tomcat 服务器下 war 包的安装方式.Jenkins 的下载地址:http://mirrors.jenkins-ci.org/,打开链接后,表格有war列 ...

  2. Mybatis JPA 插件简介(v2.1.0)

    相比之前的版本(v1.1.0),此版本(v2.1.0)做了较大的改动. 项目地址: github https://github.com/cnsvili/mybatis-jpa gitee https: ...

  3. 重拾Python(4):Pandas之DataFrame对象的使用

    Pandas有两大数据结构:Series和DataFrame,之前已对Series对象进行了介绍(链接),本文主要对DataFrame对象的常用用法进行总结梳理. 约定: import pandas ...

  4. Mlecms 反射型xss && 后台任意文件下载

    应该算0day吧,自己分析出来的,有点鸡肋,不过小cms分析确实比较简单. xss地址:search.php?word=a><img+src=1+onerror=alert`1`>a ...

  5. [HNOI 2016]最小公倍数

    Description 题库链接 给定一张 \(N\) 个顶点 \(M\) 条边的无向图(顶点编号为 \(1,2,\cdots,n\) ),每条边上带有权值.所有权值都可以分解成 \(2^a\time ...

  6. 关于非旋转treap的学习

    非旋转treap的操作基于split和merge操作,其余操作和普通平衡树一样,复杂度保证方式与旋转treap差不多,都是基于一个随机的参数,这样构出的树树高为\(logn\) split 作用:将原 ...

  7. APIO 2013

    这套好丧--跟别的画风好不一样(中国风?).提答没做也没测,假装只有两题吧.140/200 T1.ROBOTS 题目大意:h*w的网格上有n个机器人编号1~n,网格上有空地.墙.顺/逆时针转向器,每次 ...

  8. hdu 5437Alisha’s Party(优先队列)

    题意:邀请k个朋友,每个朋友带有礼物价值不一,m次开门,每次开门让一定人数p(如果门外人数少于p,全都进去)进来,当所有人到时会再开一次,每次都是礼物价值高的人先进. /*小伙伴最开始gg了,结果发现 ...

  9. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  10. QSDK下驱动AR8035

    0 概述 QSDK平台中,我所接触到的版本,能支持MIPS架构的,是基于Openwrt AA版本:虽然CC版本上就已经能很好地支持AR8035了,可是AA版本它本身是不支持的,于是不断有人要求提供补丁 ...