Buffer     缓冲,用于批量读写数据

Buffer是一个抽象类,基本数据类型都有实现类:XxxBuffer,比如ByteBuffer、CharBuffer、IntBuffer、DoubleBuffer等,最常用的是ByteBuffer、CharBuffer。

Buffer更像一个容器,用于盛装数据,可以从数据源读取数据,放在Buffer里,也可以从Buffer中取出数据来用。

Buffer中的4个概念:

  • capacity     容量,此Buffer的大小
  • limit      界限,limit是一个下标(索引),limit及以后的数据既不能读,也不能写
  • position      记录指针,记录当前读写到的位置
  • mark      标记。读写的时候,可在某处做一个标记,调用reset()方法可将记录指针重置到此mark处。

Buffer使用步骤:

(1)创建Buffer对象

static  XxxBuffer  allocate(int  capacity)      //静态方法,返回该类对应的Buffer对象

 //创建一个容量为10的CharBuffer对象,一次最多可装10个char
CharBuffer charBuffer=CharBuffer.allocate(10);

(2)往Buffer中放入数据,可使用put()往Buffer中放入数据,也可以从Channel中获取数据。

  //XxxBuffer有多个重载的put()方法,但只能放入该种类型的数据。
charBuffer.put(char c); //未指定index的,都是依次放置。一个萝卜一个坑,如果坑中有萝卜,就往后放。往坑中放萝卜时,记录指针会指向这个坑,放完后,记录指针会自动指向下一个坑。
charBuffer.put(int index,char c); //在指定的坑中放萝卜
charBuffer.put(char[] src); //放在多个坑中,一个坑一个char
charBuffer.put(String str); //放在多个坑中,一坑一个char
charBuffer.put(CharBuffer src); //把其他CharBuffer中的所有萝卜都copy一份,放到这个CharBuffer中来,一坑一个char

(3)数据放置完毕后,调用flip()方法,此方法会将limit设置为position(记录指针)的值,并将position(记录指针)的值置为0。这就标明了可读写的数据区间。

    说明:数据放置完毕后,position(记录指针)是指向最后一个萝卜后面的那个坑的。

 charBuffer.flip();

现在,Buffer做好了输出数据的准备。

(4)从Buffer中取出数据,并使用。

      charBuffer.get();   //取一个萝卜。从前往后取,只取一个。
charBuffer.get(int index); //取指定位置上的萝卜
//这里的取是指取出副本,并不是真的把萝卜从坑里拿出来,萝卜还是在这个坑里,不会变。

(5)当Buffer中的数据都用完了,不需要再保存时,就可以调用clear()清空这个Buffer,这样,每个坑都是空的了,又可以装入新的数据了。

      charBuffer.clear();

示例:

 //创建Buffer对象
CharBuffer charBuffer=CharBuffer.allocate(10); //放入数据
charBuffer.put("ABCD"); //调整指针,准备好使用数据
charBuffer.flip(); //从Buffer中取出数据来使用
System.out.println(charBuffer.get()); //A
System.out.println(charBuffer.get(2)); //取第三个,C
System.out.println(charBuffer.get()); //B //好啦,这批数据搞定了,不再用了,清空Buffer,准备好下次装入数据
charBuffer.clear(); //装入下一批数据
charBuffer.put('A'); //.........

观察上面的输出结果,调用get()获取值后,记录指针会自动指向下一个坑。调用get(int  index)获取值,记录指针并不会受到影响,还是在原来的位置。

Buffer类的其他常用方法:

  • int  capacity()    //返回容量
  • boolean   hasRemaining()    //判断是否还有元素可供处理(position、limit之间是否还有萝卜)
  • int remaining()    //还有多少个元素未处理
  • int  limit()     //返回limit的位置
  • limit(int  newLimit)    //重新设置limit(以新Buffer的形式返回,但原Buffer的limit会改变)
  • int position()   //返回当前记录指针的位置
  • position(int  newPosition)    //重置position的位置
  • mark()    //在当前position的位置做一个标记
  • reset()   //转到标记处,即将position指向mark处
  • rewind()   //将position重置为0,取消设置的mark,即从头开始。

通过 allocate() 创建的Buffer是普通Buffer。

ByteBuffer提供了 allocateDirect()  来创建直接Buffer,直接Buffer读取数据的效率很高,但创建成本很高,适合用于创建生存期较长的Buffer。一般情况用普通Buffer即可。

只有ByteBuffer类能创建直接Buffer。

Java NIO中的Buffer类的更多相关文章

  1. Java NIO中的Buffer 详解

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...

  2. 转载Java NIO中的Files类的使用

    Java NIO中的Files类(java.nio.file.Files)提供了多种操作文件系统中文件的方法. Files.exists() Files.exits()方法用来检查给定的Path在文件 ...

  3. java NIO中的buffer和channel

    缓冲区(Buffer):一,在 Java NIO 中负责数据的存取.缓冲区就是数组.用于存储不同数据类型的数据 根据数据类型不同(boolean 除外),提供了相应类型的缓冲区:ByteBufferC ...

  4. Java NIO中的Buffer

    简介 Buffer缓冲区,首先要弄明白的是,缓冲区是怎样一个概念.它其实是缓存的一种,我们常说的缓存,包括保存在硬盘上的浏览器缓存,保存在内存中的缓存(比如Redis.memcached).Buffe ...

  5. Java NIO中的缓冲区Buffer(一)缓冲区基础

    什么是缓冲区(Buffer) 定义 简单地说就是一块存储区域,哈哈哈,可能太简单了,或者可以换种说法,从代码的角度来讲(可以查看JDK中Buffer.ByteBuffer.DoubleBuffer等的 ...

  6. Java I/O(3):NIO中的Buffer

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 之前在调用Channel的代码中,使用了一个名叫ByteBuffer类,它是Buffer的子类.这个叫Buffer的类是专门用来解决高速设备与低 ...

  7. Java NIO中核心组成和IO区别

    1.Java NIO核心组件 Java NIO中有很多类和组件,包括Channel,Buffer 和 Selector 构成了核心的API.其它组件如Pipe和FileLock是与三个核心组件共同使用 ...

  8. Java NIO Channel和Buffer

    Java NIO Channel和Buffer @author ixenos Channel和Buffer的关系 1.NIO速度的提高来自于所使用的结构更接近于OS执行I/O的方式:通道和缓冲器: 2 ...

  9. JAVA nio 2 和 Path 类简介

    想要初步了解 NIO.2 API,也就是通常所说的“JSR203: More New I/O APIs for the Java Platform”,最好的切入点就是新的抽象类 java.nio.fi ...

随机推荐

  1. Windows和linux(ubuntu)互传文件简便快捷的方法

    现在很多开发和测试的工作环境都是Linux,但测试后期报告的处理一般都是在Windows下完成的,所以需要把结果拿到Windows下. 如果是同一台PC还好些(windows下安装linux的虚拟机, ...

  2. pycharm下搭建django开发环境

    在一次偶然的机会中,了解到万精油语言python,发现其流行程度发展迅速,于是也开始学习起来,正题. 1.安装python,查阅一些相关的资料及周边的开发工具,我选择python2(2.7.11),注 ...

  3. bzoj3262陌上花开 三维数点 cdq+树状数组

    大早上的做了一道三维数点一道五位数点,神清气爽! 先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问) 然后cdq分治,再变回静态,考虑前半段对后半段的影响 ...

  4. xcode8.1 autolayout 找不到 Update Frames 按钮

  5. SVM用于线性回归

    SVM用于线性回归 方法分析 在样本数据集()中,不是简单的离散值,而是连续值.如在线性回归中,预测房价.与线性回归类型,目标函数是正则平方误差函数: 在SVM回归算法中,目的是训练出超平面,采用作为 ...

  6. 【bzoj2134】单选错位 期望

    题目描述 输入 n很大,为了避免读入耗时太多,输入文件只有5个整数参数n, A, B, C, a1,由上交的程序产生数列a.下面给出pascal/C/C++的读入语句和产生序列的语句(默认从标准输入读 ...

  7. 【bzoj3751】[NOIP2014]解方程 数论

    题目描述 已知多项式方程: a0+a1*x+a2*x^2+...+an*x^n=0 求这个方程在[1,m]内的整数解(n和m均为正整数). 输入 第一行包含2个整数n.m,每两个整数之间用一个空格隔开 ...

  8. kb-09-线段树--区间合并比较繁

    /* hdu-1540 题意:一个线段,长度为n,三种操作,Dx,挖掉某个点:R,恢复最近被挖掉的点:Qx查询该点所在的连续区间的长度: 树的节点维护三个变量,该节点左边界开始连续的个数ll,右边界开 ...

  9. hihoCoder #1047 Random Tree

    题意 给出点数为 $n$($n \le 1000$)的完全图 $K_n$,带边权.随机出 $K_n$ 的一棵生成树 $T$.求 $T$ 上任意两点间距离的期望. 解法 固定两点 $u$.$v$($u ...

  10. NOJ——1649Find Sum(二分查找)

    [1649] Find Sum 时间限制: 1000 ms 内存限制: 65535 K 问题描述 This problem is really boring. You are given a numb ...