Java NIO中的Buffer类
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类的更多相关文章
- Java NIO中的Buffer 详解
Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...
- 转载Java NIO中的Files类的使用
Java NIO中的Files类(java.nio.file.Files)提供了多种操作文件系统中文件的方法. Files.exists() Files.exits()方法用来检查给定的Path在文件 ...
- java NIO中的buffer和channel
缓冲区(Buffer):一,在 Java NIO 中负责数据的存取.缓冲区就是数组.用于存储不同数据类型的数据 根据数据类型不同(boolean 除外),提供了相应类型的缓冲区:ByteBufferC ...
- Java NIO中的Buffer
简介 Buffer缓冲区,首先要弄明白的是,缓冲区是怎样一个概念.它其实是缓存的一种,我们常说的缓存,包括保存在硬盘上的浏览器缓存,保存在内存中的缓存(比如Redis.memcached).Buffe ...
- Java NIO中的缓冲区Buffer(一)缓冲区基础
什么是缓冲区(Buffer) 定义 简单地说就是一块存储区域,哈哈哈,可能太简单了,或者可以换种说法,从代码的角度来讲(可以查看JDK中Buffer.ByteBuffer.DoubleBuffer等的 ...
- Java I/O(3):NIO中的Buffer
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 之前在调用Channel的代码中,使用了一个名叫ByteBuffer类,它是Buffer的子类.这个叫Buffer的类是专门用来解决高速设备与低 ...
- Java NIO中核心组成和IO区别
1.Java NIO核心组件 Java NIO中有很多类和组件,包括Channel,Buffer 和 Selector 构成了核心的API.其它组件如Pipe和FileLock是与三个核心组件共同使用 ...
- Java NIO Channel和Buffer
Java NIO Channel和Buffer @author ixenos Channel和Buffer的关系 1.NIO速度的提高来自于所使用的结构更接近于OS执行I/O的方式:通道和缓冲器: 2 ...
- JAVA nio 2 和 Path 类简介
想要初步了解 NIO.2 API,也就是通常所说的“JSR203: More New I/O APIs for the Java Platform”,最好的切入点就是新的抽象类 java.nio.fi ...
随机推荐
- centos7 安全配置
CentOS是最多人用来运行服务器的 Linux 版本,最新版本是 CentOS 7.当你兴趣勃勃地在一台主机或 VPS 上安装 CentOS 7 后,首要的工作肯定是加强它的安全性,以下列出的七件事 ...
- The Best Path HDU - 5883 欧拉通路
图(无向图或有向图)中恰好通过所有边一次且经过所有顶点的的通路成为欧拉通路,图中恰好通过所有边一次且经过所有顶点的回路称为欧拉回路,具有欧拉回路的图称为欧拉图,具有欧拉通路而无欧拉回路的图称为半欧拉图 ...
- 安装repo
$ sudo apt-get install curl -y$ curl "http://android.git.linaro.org/gitweb?p=tools/repo.git;a=b ...
- Linux学习-Linux 主机上的用户讯息传递
查询使用者: w, who, last, lastlog 如果你想要知道目前已登入在系统上面的用户呢?可以透过 w 或 who 来查询喔!如下范例所示: [root@study ~]# w 01:49 ...
- 像玩魔兽一样编程——谈VS2010键盘流
早年在学校里的时候,经常玩War3,那时候很痴迷,也经常看sky.moon的一些第一视角,有的时候也会模仿模仿...好吧,往事不堪回首,现在工作了,谈一谈.Net程序猿使用VS的键盘流,如果你不知道s ...
- 关于.net 项目 nuget包还原项目失败的记录
在.net项目中,一般通过vs打开项目,会自动进行nuget包还原,可能因为其他一些因素,包还原失败,同时在之前包依赖是可以正常使用,现在却提示包 AutoMapper 6.2.2 与 netcore ...
- Apache 根据不同的端口 映射不同的站点
以前,在本地新建个项目,总是在Apache的htdocs目录下新建个项目目录,今年弄了个别人写好的网站源码,因为该系统的作者假定网站是放在根目录的,放在二级目录下会出错.所以无奈,只能想办法,根据端口 ...
- 大数据学习——scala的wordCount小例子
val lines=List("hello tom hello jerry","hello tom hello kitty hello china") //方法 ...
- Java学习ing
ConcurrentHashMap从JDK1.5开始随java.util.concurrent包一起引入JDK中,主要为了解决HashMap线程不安全和Hashtable效率不高的问题. Concur ...
- CF878D D. Magic Breeding bitset
D. Magic Breeding time limit per test 4 seconds memory limit per test 1024 megabytes input standard ...