Java NIO之缓冲区Buffer
Java NIO的核心部件:
Buffer
Channel
Selector
Buffer
是一个数组,但具有内部状态。如下4个索引:
- capacity:总容量
- position:下一个要读取/写入的元素索引
- limit:限制,第一个不能读取/写入的元素索引
- mark:位置标记,重置position
- //通过调用Buffer.mark()方法,可以标记Buffer中的一个特定position。之后可以通过调用Buffer.reset()方法恢复到这个position//
- 0 <= mark <= position <= limit <= capacity
用例:
初始状态:

初始如上图,添加数据:put()方法会改变position的值,但put(int,object)不会改变
buffer.put((byte) H).put((byte) e).put((byte) l).put((byte) l).put((byte) o);

在上图的基础上进行flip()操作,则会进入下面的状态:

flip:将缓冲区准备为数据传出状态,即limit=position,position=0
在上图基础上,进行get操作,position会后移,知道position=limit,如下图:

在上图基础上,进行rewind()的操作,position为0,limit不变,如下图,如需多次读取缓冲区数据,可以在两次读取之间使用rewind()。

假设新的状态如下图:

在新状态下进行compact()操作,进入下面状态

在新状态下进行clear()操作,返回到初始状态,即position=0,limit=capacity

Buffer的类型:
- ByteBuffer
- MappedByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
Buffer的分配:工厂方法
1、allocate
//申请48字节
ByteBuffer buf = ByteBuffer.allocate(48);
//申请1024字符
CharBuffer buf = CharBuffer.allocate(1024);2、wrap,包装一个已有的数组
char [] myArray = new char [100];
CharBuffer charbuffer = CharBuffer.wrap (myArray);注意,这样的方式创建的Buffer,将不会在堆上创建新的数组,而是直接利用myArray做backing store,这意味着任何对myArray或者buffer的修改都将影响到buffer或者myArray。
3、复制Buffer:“浅拷贝”
- a)通过duplicate()方法将返回一个新创建的buffer,这个新buffer与原来的Buffer共享数据,一样的capacity,但是有自己的position、limit和mark属性。
- b)通过asReadOnlyBuffer()方法复制的buffer与duplicate()类似,是只读的,不能调用put。
- c)slice()方法,故名思议,类似切割一个Buffer出来,与duplicate类似,但是它将从原来Buffer的当前position开始,并且capacity等于原来Buffer的剩余元素数目,也就是(limit-position)。
向Buffer写数据
从channel写入到Buffer
intbytesRead = inChannel.read(buf);
通过Buffer的put方法写入
buf.put(127);
相对位置:在position之后写入数据,并改变position
put(byte b);
put(byte[] src);
put(byte[] src, int offset, int length);
put(ByteBuffer src);
绝对位置:提供写入的位置,并不改变position值。
put(int index, byte b);
从Buffer读数据
从channel读出数据
intbytesWritten = inChannel.write(buf);
通过Buffer的get方法
相对位置
get()
get(byte[] dst);
get(byte[] dst, int offset, int length);
绝对位置
get(int index);
Java NIO之缓冲区Buffer的更多相关文章
- Java NIO流 -- 缓冲区(Buffer,ByteBuffer)
用来定义缓冲区的所有类都以Buffer类为基类,Buffer定义了缓冲区的基本特征. 直接子类: ByteBuffer 用来存储byte类型的缓冲区,可以在这种缓冲区中存储任意其他基本类型的二进制值( ...
- Java NIO中的Buffer 详解
Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...
- NIO之缓冲区(Buffer)的数据存取
缓冲区(Buffer) 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通道 ...
- Java NIO Channel和Buffer
Java NIO Channel和Buffer @author ixenos Channel和Buffer的关系 1.NIO速度的提高来自于所使用的结构更接近于OS执行I/O的方式:通道和缓冲器: 2 ...
- Java NIO 之缓冲区
缓冲区基础 所有的缓冲区都具有四个属性来 供关于其所包含的数据元素的信息. capacity(容量):缓冲区能够容纳数据的最大值,创建缓冲区后不能改变. limit(上界):缓冲区的第一个不能被读或写 ...
- Java NIO——2 缓冲区
一.缓冲区基础 1.缓冲区并不是多线程安全的. 2.属性(容量.上界.位置.标记) capacity limit 第一个不能被读或写的元素 position 下一个要被读或写的元素索引 mark ...
- Java NIO4:缓冲区Buffer(续)
一.什么是缓冲区 一个缓冲区对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里数据可被存储并在之后用于检索.缓冲区像前篇文章讨论的那样被写满和释放,对于每个非布尔原始数据 ...
- Java NIO3:缓冲区Buffer
在上一篇中,我们介绍了NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是一个数组,但它其实是一个特殊的数组,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况,如 ...
- java NIO中的buffer和channel
缓冲区(Buffer):一,在 Java NIO 中负责数据的存取.缓冲区就是数组.用于存储不同数据类型的数据 根据数据类型不同(boolean 除外),提供了相应类型的缓冲区:ByteBufferC ...
随机推荐
- Vi 的基本使用
一.Vi入门 Unix 提供了全屏幕的Vi编辑器,这使我们的工作轻松不少.不少DOS用户抱怨Vi编辑器不象DOS下的编辑器如edit那么好用,这 是因为Vi考虑到各种用户的需要,没有使用某些通用的编 ...
- WdatePicker 开始日期不能大于结束日期,结束时间不能小于开始时间
<input class="input_calendar inputcss" id="startDate" runat="server" ...
- 在ubuntu上搭建开发环境8---Ubuntu搭建Android开发环境
需要首先配置好JDK环境 参看:http://www.cnblogs.com/xumenger/p/4460055.html 安装Eclipse 在Android developer的官网上直接下载a ...
- Delphi开发中各种文件扩展名代表什么文件
暂时就遇到了以下这几种,以后遇到再进行补充 .DPR Delphi Project文件,打开这个文件,就会打开所有的编程的代码文件.包含了Pascal代码 .PAS Pascal文件,Pascal单元 ...
- log4net的配置与使用
log4net解决的问题是在.Net下提供一个记录日志的框架,它提供了向多种目标写入的实现,比如利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括MS SQ ...
- 对服务器的ftp端口进行修改
对服务器的ftp端口进行了修改,把21端口改了,比如221端口,就这样用221连接的时候,连接登录成功,但打不开目录,为何,总结如下: 1.完成一个FTP的传输过程不仅仅只需要21一个端口,而是2个端 ...
- 三、spinner
今天 ,看的和学的都不多,就弄了一个spinner控件而已,下面就记录一下spinner 用法吧 基本上说,使用spinner 有三个步骤 一.在布局文件里面设置spinner 控件,这个不用再多说了 ...
- WPF QuickStart系列之附加属性(Attached Property)
这一篇博客是关于如何使用附加属性和创建自定义附加属性的. 1. 附加属性使用, WPF中对附加属性使用最多的莫过于对控件布局时设置控件的位置,例如在Canvas中有一个Rectangle, Ellip ...
- Http 请求处理流程
引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何一步步拖放控件.设置控件属性.编写CodeBehind代码,以实现某个特定 ...
- SQL作业的操作全
--定义创建作业 转自http://hi.baidu.com/procedure/blog/item/7f959fb10d76f95d092302dd.html DECLARE @jobid uniq ...