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. Python中的列表(1)

    1.什么是列表? 列表是由一组按特定顺序排列的元素组成. 2.如何表示? 在Python中用方括号([ ])来表示列表.栗子如下: contries = ['China','England','Fra ...

  2. Java Web系统常用的第三方接口

    1.    Web Service 接口 1.1 接口方式说明和优点 在笔者的开发生涯中,当作为接口提供商给第三方提供接口时,以及作为客户端去调用第三方提供的接口时,大部分时候都是使用 Web  Se ...

  3. 20181207(sys,shelve,logging)

    一.logging模块 logging专门用来记录日志 日志的级别分为五级,可以用数字表示,从低到高分别为: import  logginglogging.info('info')   #10logg ...

  4. 20个必不可少的Python库也是基本的第三方库

    个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Kenneth Reitz写的最富盛名的http库.每个Python程序员都应该有它. Scrapy. ...

  5. cmake命令 安装、用法简介

    前言 cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中所产生的衍生品.后来经过发展,最终形成体系,在2001年成为一个独立的开放源代码项目.其官方网站是www.cm ...

  6. Ubuntu 15 下 Qt 配置mysql链接及基本操作

    序 最近需要在Linux下做一个unix网络编程项目,选择了Ubuntu 最新版本15.04 : 开发环境:Qt 5 数据库: MySQL 安装Qt 和 MySQL 简要介绍一下软件的安装! 安装Qt ...

  7. 【HIHOCODER 1176】 欧拉路·一

    描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的角色来到了一个很大的湖边.湖上有N个小岛(编号1..N),以及连接小岛的 ...

  8. spring+struts2+hibernate框架依赖pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  9. debug环境下打印

    #ifdef DEBUG #    define NSLog(...) NSLog(__VA_ARGS__) #else #    define NSLog(...) {} #endif

  10. Linux中 find 常见用法示例

    Linux中find常见用法示例 #find path -option [ -print ] [ -exec -ok command ] {} \; #-print 将查找到的文件输出到标准输出 #- ...