Buffer中clear(),flip()和rewind()的理解
来源:互联网 发布:java base64转码 编辑:程序博客网 时间:2024/06/06 17:42
理解缓冲区的概念,就是Buffer的意义:缓冲区是特定基本类型元素的线性有限序列。除内容外,缓冲区的基本属性还包括容量、限制和位置:
缓冲区的容量 是它所包含的元素的数量。缓冲区的容量不能为负并且不能更改。
缓冲区的限制 是第一个不应该读取或写入的元素的索引。缓冲区的限制不能为负,并且不能大于其容量。 限制也就是当前缓冲区中有效内容的大小
缓冲区的位置 是下一个要读取或写入的元素的索引。缓冲区的位置不能为负,并且不能大于其限制。
任何插入或读取都不能超出限制。
标记、位置、限制和容量值遵守以下不变式:
0 <= 标记 <= 位置 <= 限制 <= 容量
新创建的缓冲区总有一个 0 位置和一个未定义的标记。初始限制可以为 0,也可以为其他值,这取决于缓冲区类型及其构建方式。一般情况下,缓冲区的初始内容是未定义的。
clear() 使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0。
通道读取指从通道将数据读入到buffer中,相对放置是从位置开始将数据插入到buffer中
clear()用来初始化缓存空间,例如读取文件时将文件内容置入缓存时要先执行此方法。
flip() 使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置(相当于设置一个标志,说明只想处理从0到该位置的内容,即将这些内容视为此次的有效数据),然后将位置设置为 0。(也就是在缓冲区中选择从0开始到指定位置的内容,例如在换行符位置处设置限制,那么可以选取缓冲器中的一行数据)把限制设置为当前位置是为了保证数据的可靠性。让从buffer写入到通道的数据是buffer中确实是已经存在的数据。
下面的几个方法都是为了读取缓冲区的数据做准备。
rewind() 使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,将位置设置为 0。(也就是相当于选取当前缓冲去总的全部有效数据)和clear()类似,只是不改动限制.
可以结合代码体会
(原文:http://blog.csdn.net/cynhafa/article/details/7410013):
import Java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;public class ReadWriteCompare{public static void main(String[] args) throws IOException{FileInputStream fileInputStream = new FileInputStream("f:"+ File.separator +"IBM e-Mentor Program Kickoff Night 1105.pdf");FileOutputStream fileOutputStream = new FileOutputStream("f:" + File.separator + "test.pdf"); FileChannel inChannel = fileInputStream.getChannel();FileChannel outChannel= fileOutputStream.getChannel();ByteBuffer byteBuffer = ByteBuffer.allocate(1024); //Direct Buffer的效率会更高。// ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024); long start = System.currentTimeMillis();while(true){int eof = inChannel.read(byteBuffer);if(eof == -1 ) break;byteBuffer.flip(); outChannel.write(byteBuffer);byteBuffer.clear();}System.out.println("spending : " + (System.currentTimeMillis()-start));inChannel.close();outChannel.close();}}
- Buffer中clear(),flip()和rewind()的理解
- buffer中clear rewind flip的区别
- NIO中有关Buffer的几种常用方法比如clear,rewind和flip
- Java NIO之Buffer中flip()、rewind()、clear()方法解析
- NIO之Buffer的clear()、rewind()、flip()方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear
- java NIO关于*Buffer的 flip | reset | rewind | clear 的灵活使用备忘
- Buffer(ByteBuffer)以及flip,clear及rewind区别
- ByteBuffer的flip clear及rewind区别
- windows下solrcloud+tomcat+zookeeper伪集群环境搭建
- java基础学习总结——抽象类
- Android Studio 使用教程1
- 143. Reorder List
- android使用代码写布局文件
- Buffer中clear(),flip()和rewind()的理解
- java基础学习总结——接口
- 软件设计模式——迭代器模式(Iterator Pattern)
- Android Studio 使用教程2
- Firebug使用详解
- 操作系统第一次上机实验 进程控制(终极版)
- Hadoop学习笔记(1)----项目简述
- Java加密技术(八)——数字证书
- Java基础学习总结——Java对象的序列化和反序列化