java Buffer 记录
来源:互联网 发布:淘宝推广收费标准 编辑:程序博客网 时间:2024/06/10 21:18
数据的输出往往是比较耗时操作的。缓冲区从两个方面提高了I/O操作的效率:
a、减少实际的物理读写次数
b、缓冲区被创建时已经分配了,这块内存区域一直被重用,这可以减少动态分配和回收内存区域的次数。
Buffer 属于java.nio.channal 包下的一个抽象类
Buffer 结果如下: 其他类都继承了buffer MappedByteBuffer继承 ByteBuffer
缓冲区的基本属性还包括容量、限制和位置:
a、容量(capacity):表示该缓冲区能够保存多少数据(可以包含元素的数量),缓冲区的容量不能为负并且不能更改。
b、限制(limit):表示 第一个不应该读取或写入的元素的索引,缓冲区的限制不能为负,并且不能大于其容量,极限是可以修改的,这有利于缓冲区的重用
例如:假设容量为100的缓冲区已经填充了6个元素,接着程序重用缓存区时,将2个元素写入缓冲区从位置0到2 ,这时极限是2 这样就不能读取之前的数据在写入数据时超过设置的极限的位置(超过或者2的位置)也不能写入也不能读取 会报异常
代码示例
1、复用缓冲区(在极限范围内):
public static void main(String[] args) {ByteBuffer buffer =ByteBuffer.allocate(100); buffer.put((byte)1);buffer.put((byte)2);buffer.put((byte)3);buffer.put((byte)4);buffer.put((byte)5);buffer.put((byte)6);System.out.println("复用前索引0位置的元素:"+buffer.get(0));System.out.println("复用前索引1位置的元素:"+buffer.get(1));buffer.position(0);//复用缓存区设置位置为 0buffer.limit(2);//复用缓存区设置极限为 2buffer.put((byte)7); // 添加新的元素buffer.put((byte)8);// 添加新的元素System.out.println("复用后索引0位置的元素:"+buffer.get(0));System.out.println("复用后索引1位置的元素:"+buffer.get(1));}}运行结果如下:从运行结果可以看出0、1位置的数据被替换掉了 缓冲区之前的数据不可用了
复用前索引0位置的元素:1复用前索引1位置的元素:2复用后索引0位置的元素:7复用后索引1位置的元素:82、复用缓冲区(写入数据位置超过了或者极限的设置的索引)
public static void main(String[] args) {ByteBuffer buffer =ByteBuffer.allocate(1024);buffer.put((byte)1);buffer.put((byte)2);buffer.put((byte)3);buffer.put((byte)4);buffer.put((byte)5);buffer.put((byte)6);System.out.println("复用前索引0位置的元素:"+buffer.get(0));System.out.println("复用前索引1位置的元素:"+buffer.get(1));System.out.println("添加 7");buffer.put((byte)7); // 添加新的元素System.out.println("添加 8");buffer.put((byte)8);// 添加新的元素System.out.println("添加 9");buffer.put((byte)9);// 添加新的元素 出现了java.nio.BufferOverflowExceptionSystem.out.println("获取数据");}}
运行结果如下:在添加第三数据的时候出现了异常 由于在添加数据的时候 添加数据的位置索引与极限索引相同了所以不能写入了
复用前索引0位置的元素:1复用前索引1位置的元素:2添加 7添加 8添加 9Exception in thread "main" java.nio.BufferOverflowExceptionat java.nio.Buffer.nextPutIndex(Buffer.java:513)at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:163)at channel.BufferEntry.main(BufferEntry.java:38)
3、复用缓冲区(读取数据位置超过了或者极限的设置的索引)
public static void main(String[] args) {ByteBuffer buffer =ByteBuffer.allocate(1024);buffer.put((byte)1);buffer.put((byte)2);buffer.put((byte)3);buffer.put((byte)4);buffer.put((byte)5);buffer.put((byte)6);System.out.println("复用前索引0位置的元素:"+buffer.get(0));System.out.println("复用前索引1位置的元素:"+buffer.get(1));System.out.println("复用前索引2位置的元素:"+buffer.get(2));buffer.position(0);//复用缓存区设置位置为 0buffer.limit(2);//复用缓存区设置极限为 2buffer.put((byte)7); // 添加新的元素buffer.put((byte)8);// 添加新的元素System.out.println("读取 0位置");System.out.println("复用后索引0位置的元素:"+buffer.get(0));System.out.println("读取 1位置");System.out.println("复用后索引1位置的元素:"+buffer.get(1));System.out.println("读取 2位置");System.out.println("复用后索引2位置的元素:"+buffer.get(2));// 读取异常 java.lang.IndexOutOfBoundsExceptionSystem.out.println("读取 结束");}}运行结果如下:结果来看获取第三个数据时出现了异常 由于在读取数据的时候 读取数据的位置索引与极限索引相同了所以不能写入了
复用前索引0位置的元素:1复用前索引1位置的元素:2复用前索引2位置的元素:3读取 0位置复用后索引0位置的元素:7读取 1位置复用后索引1位置的元素:8读取 2位置Exception in thread "main" java.lang.IndexOutOfBoundsExceptionat java.nio.Buffer.checkIndex(Buffer.java:532)at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:139)at channel.BufferEntry.main(BufferEntry.java:46)
c、位置(position):是下一个要读取或写入的元素的索引 ,缓冲区的位置不能为负,并且不能大于其限制,在每次读写数据的时候都会改变该值,为下一次读写数据做准备
说明:0 <= 位置 <= 限制 <= 容量
缓冲区(Buffer)提供的操作以上三个属性的的方法:
a、clear() 使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0。
b、flip() 使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置,然后将位置设置为 0。
c、rewind() 使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,将位置设置为 0。
d、remaining()的方法返回当前位置与限制之间的元素数。
c、compact()方法 删除缓冲区从0到当前位置position的内容,然后把从当前位置position到极限limit的复制到limit减去position的区域内,当前位置position和极限limit的取值也发生了相应的变化 如图:
对于Buffer 的子类都提供了进行子类实例化的的静态工厂方法allocate(int capacity)
分配一个新的字节缓冲区。allocateDirect(int capacity)
分配新的直接字节缓冲区
对于这两种方法的区别暂时还未有结论
- java Buffer 记录
- Java NIO之Channel和Buffer学习记录
- java - Buffer
- innodb change buffer记录格式
- nio学习记录Buffer(1)
- java direct buffer VS non-direct buffer
- java direct buffer VS non-direct buffer
- java nio之Buffer
- java.nio.Buffer分析
- java.nio.Buffer分析
- Java NIO Buffer
- Protocol Buffer Basics: Java
- Java NIO(4-Buffer)
- Java NIO Buffer
- Java NIO 之 buffer
- proto buffer - java
- Java NIO---buffer
- Protocol Buffer Basics: Java
- 【Scikit-Learn 中文文档】交叉验证
- 谈谈UIView的几个layout方法-layoutSubviews、layoutIfNeeded、setNeedsLayout...
- 性能调优攻略
- JZOJ5483. 【清华集训2017模拟11.26】简单路径
- Linux基本服务相关命令
- java Buffer 记录
- 指向函数的指针
- hdu 1864 最大报销额
- postgresql创建表
- Minor GC、Major GC和Full GC之间的区别
- 【Scikit-Learn 中文文档】优化估计器的超参数
- yii框架学习经历-2.6使用 Gii 生成代码
- NOIP 2017 Senior 6
- 特征点的提取与匹配