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 ...
随机推荐
- jsp常用动作
jsp:include 动态包含: jsp:forward 转发: jsp:useBean 实例化bean对象: jsp:setProperty 设置一个属性值 jsp:getProperty 获取一 ...
- python3.7 文件操作
#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 文件操作 # r 只读,默认打开方式,当文件不存在时会报错 # ...
- w3resource_MySQL练习:Subquery
w3resource_MySQL练习题:Subquery 1. Write a query to find the name (first_name, last_name) and the salar ...
- sqli-labs less1 &&less3&&less4学习心得
0x01.less1 id=1/ id=1 and 1=1结果正常 id=1 and 1=2结果正常,不合理 id=1'提示:
- POJ:1086-Parencodings
Parencodings Time Limit: 1000MS Memory Limit: 10000K Description Let S = s1 s2-s2n be a well-formed ...
- Android兼容性测试CTS Verifier-环境搭建、测试执行、结果分析
CTS Verifier算是CTS的一部分,需要手动进行,主要用于测试那些自动测试系统无法测试的功能,比如相机.传感器等.由于硬件配置或其他原因,不同手机上部分测试项目被隐藏,也就是说CTS Veri ...
- Android开发——减小APK大小
0. 前言 APK的大小对APP的加载速度,使用内存大小和消耗功率多少有一定影响.如何减小APK的大小对于Android开发者是一个永恒的话题. 查阅了很多相关资料,并将其做了删减以及总结.本文原创, ...
- TSS (任务状态段)的作用及结构
1.什么是TSS TSS全称Task State Segment ,是操作系统在进行进程切换时保存进程现场信息的段 2.TSS什么时候用,有什么用 TSS在任务(进程)切换时起着重要的作用,通过它保存 ...
- Notepad++ WebEdit插件
虽然PHP的IDE有很多,但是,我还是比较喜欢用Notepad++这款编辑器,因为比较轻量级,而且用起来比较顺手. 但是最近在改别人写的代码的时候,经常要在选定的php前后插入<?php ?& ...
- spring boot配置
spring.application.name=XXXXXserver.port=9515 # health显示down的问题endpoints.health.sensitive= falsemana ...