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();}}
1 0
原创粉丝点击