文档章节

缓冲器(Buffer)的细节

蜀山下的鱼
 蜀山下的鱼
发布于 2015/04/29 00:44
字数 825
阅读 5
收藏 0

 

 从上面继承图层来看,了解Buffer很重要。

 

Buffer=数据+四个索引

 

正是四个索引才是的数据可以高效访问,这四个索引是:mark(标记),position(位置),limit(界限),capacity(容量)。

 

不变式

标记、位置、限制和容量值遵守以下不变式:

0 <= 标记 <= 位置 <= 限制 <= 容量

 

 

以下是设置和复位索引以及查询的方法:

                             capacity() :返回此缓冲区的容量。

                                  clear() :清除此缓冲区。

                                     flip() :反转此缓冲区。

                                    limit() :返回此缓冲区的限制。

                   limit(int newLimit) :设置此缓冲区的限制。

                                   mark() :在此缓冲区的位置设置标记。

                               position() :返回此缓冲区的位置。 
         position(int newPosition) :设置此缓冲区的位置。 
                            remaining() :返回当前位置与限制之间的元素数。 
                                   reset() :将此缓冲区的位置重置为以前标记的位置。
                                 rewind() :重绕此缓冲区。

通过代码查看:

package org.com.mayi;

import java.nio.ByteBuffer;
import java.nio.CharBuffer;

public class Test_ByteBuffer {
	static int capacity1,limit1,position1;
	/**
	 * @param args
	 */
	public static void main(String[] args){
		byte[] b = "my test".getBytes();//获取字节数组
		ByteBuffer bytebuffer =ByteBuffer.allocate(15);//定义一个buffer,并为之分配容量。
		bytebuffer.put(b);//把字节放进buffer
		
		  capacity1 = bytebuffer.capacity();//返回buffer容量
		  limit1 = bytebuffer.limit();//返回buffer界限
		  position1 = bytebuffer.position();//返回buffer位置
		  /*没有设置mark(标记), */
		 System.out.println("容量:"+capacity1+"    界限:"+limit1+"   位置: "+position1+"    mark:"+"需要自己设置");
		 
		//反转此缓冲区,从结果来看,我们知道,capacity不变,limit=position  ;position=0;
	     //此时的buffer感觉就像队列一样,先进先出。
		 bytebuffer.flip();
		 capacity1 = bytebuffer.capacity();
		  limit1 = bytebuffer.limit();
		  position1 = bytebuffer.position();
		 System.out.println("容量:"+capacity1+"    界限:"+limit1+"   位置: "+position1+"    mark:"+"需要自己设置");
		 
		 //重绕此缓冲区,其实就是相当于刷新一下,通知buffer做好读或写的准备,并没有什么改变。
		 bytebuffer.rewind();
		 capacity1 = bytebuffer.capacity();
		  limit1 = bytebuffer.limit();
		  position1 = bytebuffer.position();
		 System.out.println("容量:"+capacity1+"    界限:"+limit1+"   位置: "+position1+"    mark:"+"需要自己设置");

	}

}


 

输出:

容量:15    界限:15   位置: 7    mark:需要自己设置
容量:15    界限:7   位置: 0    mark:需要自己设置
容量:15    界限:7   位置: 0    mark:需要自己设置

 

 通过查看API文档,又找到一些官方解释:哈哈。。。

清除、反转和重绕

除了访问位置、限制、容量值的方法以及做标记和重置的方法外,此类还定义了以下可对缓冲区进行的操作:

  • clear() 使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0。

  • flip() 使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置,然后将位置设置为 0。

  • rewind() 使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,将位置设置为 0。

 

理解了这四个索引的工作是很重要的,做到数据输入输出时,缓冲区在干什么,心中有数,不至于茫茫然,看别人的代码这样写,你也稀里糊涂的跟着写了。

如果有兴趣,可以查看《java编程思想》的NIO那一章,有很详细的解释,里面是图文结合,比我的好多了。我在这里写下,也只是做一个简单笔记罢了。。。

本文转载自:http://blog.csdn.net/caiwenfeng_for_23/article/details/8454223

蜀山下的鱼
粉丝 9
博文 405
码字总数 0
作品 0
广州
高级程序员
私信 提问
go语言的bytes.buffer

bytes.buffer是 bytes.buffer是一个缓冲byte类型的缓冲器,这个缓冲器里存放着都是byte 创建一个缓冲器 NewBuffer 如果在使用bytes.NewBuffer的时候,参数是[]byte的slice的话 缓冲器里就是这...

waynehu
2013/05/06
0
1
不学无数——Java中IO和NIO

JAVA中的I/O和NIO I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道。在当今这个数据大爆炸时代,I/O 问题尤其...

不学无数的程序员
2018/11/22
0
0
不学无数——JAVA中NIO再深入

JAVA中NIO再深入 在上一章节的JAVA中的I/O和NIO我们学习了如何使用NIO,接下来再深入了解一下关于NIO的知识。 缓冲器内部的细节 由数据和可以高效地访问及操作这些数据的四个索引组成。这四个...

不学无数的程序员
2018/11/26
0
0
OpenGL学习之路2----画一个点

根据教程:ogldev一步步从零开始,记录学习历程 一、简述 这一节比上一节《打开一个窗口》,多了需要使用glew库和3d数学库 glew是OpenGL的扩展库,用于帮助C/C++开发者初始化扩展(OpenGL扩展...

zach_z
2018/04/23
0
0
Node 深入Stream(2)

1. Node.js 中有四种基本的流类型: Readable - 可读的流 (例如 fs.createReadStream()). Writable - 可写的流 (例如 fs.createWriteStream()). Duplex - 可读写的流 (例如 net.Socket). Tra...

lio-mengxiang
03/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql免安装版,服务无法启动没有抱任何错误

1.解压 2.新建my.ini [mysqld]# Remove leading # and set to the amount of RAM for the most important data# cache in MySQL. Start at 70% of total RAM for dedicated server, e......

榴莲黑芝麻糊
18分钟前
0
0
Qt编写安防视频监控系统3-通道交换

一、前言 最开始写通道交换的功能的时候,走了很多弯路,比如最开始用最初级的办法,触发交换的时候,先关闭视频,然后设置新的url重新打开视频,这样处理非常低级而且耗内存还卡还很慢,毕竟...

飞扬青云
18分钟前
0
0
如何远程调试部署在CloudFoundry平台上的nodejs应用

网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等。 在实际情况中,我们可能遇到本地运行良好,但是部署到C...

JerryWang_SAP
39分钟前
5
0
微信扫码访问网站调用默认浏览器打开如何实现?

我们在微信内分享链接或二维码的时候,我们会发现我们的网站是可以在浏览器里正常打开的,但就是不能在微信里打开,提示 “ 已停止访问该网页 ”,无论是聊天框也一样。说是系统检测到您的网...

明尼苏达哈士奇
47分钟前
3
0
一份Java程序员进阶架构师的秘籍,你离架构师还差多远

一、如何定义架构师 Java架构师,首先要是一个Java程序员,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,怎么解决并...

我最喜欢三大框架
55分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部