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. jsp常用动作

    jsp:include 动态包含: jsp:forward 转发: jsp:useBean 实例化bean对象: jsp:setProperty 设置一个属性值 jsp:getProperty 获取一 ...

  2. python3.7 文件操作

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 文件操作 # r 只读,默认打开方式,当文件不存在时会报错 # ...

  3. w3resource_MySQL练习:Subquery

    w3resource_MySQL练习题:Subquery 1. Write a query to find the name (first_name, last_name) and the salar ...

  4. sqli-labs less1 &&less3&&less4学习心得

    0x01.less1 id=1/ id=1 and 1=1结果正常 id=1 and 1=2结果正常,不合理 id=1'提示:

  5. POJ:1086-Parencodings

    Parencodings Time Limit: 1000MS Memory Limit: 10000K Description Let S = s1 s2-s2n be a well-formed ...

  6. Android兼容性测试CTS Verifier-环境搭建、测试执行、结果分析

    CTS Verifier算是CTS的一部分,需要手动进行,主要用于测试那些自动测试系统无法测试的功能,比如相机.传感器等.由于硬件配置或其他原因,不同手机上部分测试项目被隐藏,也就是说CTS Veri ...

  7. Android开发——减小APK大小

    0. 前言 APK的大小对APP的加载速度,使用内存大小和消耗功率多少有一定影响.如何减小APK的大小对于Android开发者是一个永恒的话题. 查阅了很多相关资料,并将其做了删减以及总结.本文原创, ...

  8. TSS (任务状态段)的作用及结构

    1.什么是TSS TSS全称Task State Segment ,是操作系统在进行进程切换时保存进程现场信息的段 2.TSS什么时候用,有什么用 TSS在任务(进程)切换时起着重要的作用,通过它保存 ...

  9. Notepad++ WebEdit插件

    虽然PHP的IDE有很多,但是,我还是比较喜欢用Notepad++这款编辑器,因为比较轻量级,而且用起来比较顺手. 但是最近在改别人写的代码的时候,经常要在选定的php前后插入<?php  ?& ...

  10. spring boot配置

    spring.application.name=XXXXXserver.port=9515 # health显示down的问题endpoints.health.sensitive= falsemana ...