设为首页收藏本站language 语言切换
查看: 1251|回复: 0
收起左侧

Java入门:使用get和put方法按顺序读写数据

[复制链接]
发表于 2010-2-20 14:40:24 | 显示全部楼层 |阅读模式
<p >对于缓冲区来说,最重要的操作就是读写操作。缓冲区提供了两种方法来读写缓冲区中的数据:get、put方法和array方法。而get、put方法可以有三种读写数据的方式:按顺序读写单个数据、在指定位置读写单个数据和读写数据块。除了上述的几种读写数据的方法外,CharBuffer类还提供了用于专门写字符串的put和append方法。在本文及后面的文章中将分别介绍这些读写缓冲区的方法。<p ><p >虽然使用allocate方法创建的缓冲区并不是一次性地分配内存空间,但我们可以从用户地角度将一个缓冲区想象成一个长度为capacity的数组。当缓冲区创建后,和数组一样,缓冲区的大小(capacity值)将无法改变,也无法访问缓冲区外的数据。如下面的代码创建了一个大小为6的字节缓冲区。<p ><p >ByteBuffer byteBuffer = ByteBuffer.allocate(6);<p >对于byteBuffer来说,只能访问属于这个缓冲区的六个字节的数据,如果超过了这个范围,将抛出一个BufferOverflowException异常,这是一个运行时错误,因为这个错误只能在程序运行时被发现。<p ><p >既然缓冲区和数组类似,那么缓冲区也应该象数组一样可以标识当前的位置。缓冲区的position方法为我们提供了这个功能。position方法有两种重载形式,它们的定义如下:<p ><p >public final int position()<p >public final Buffer position(int newPosition)<p ><p >第一个重载形式用来获取缓冲区的当前位置。在创建缓冲区后,position的初始值是0,也就是缓冲区第一个元素的位置。当从缓冲区读取一个元素后,position的值加1。我们从这一点可以看出,position方法返回的位置就是当前可以读取的元素的位置。position的取值范围从0到capacity – 1。如果position的值等于capacity,说明缓冲区当前已经没有数据可读了。<p ><p >position方法的第二个重载形式可以设置缓冲区的当前位置。参数newPosition的取值范围是0 <= newPosition < capacity。如果newPosition的值超出这个范围,position方法就会抛出一个IllegalArgumentException异常。<p ><p >在大多数情况下不需要直接控制缓冲区的位置。缓冲区类提供的用于读写数据的方法可以自动地设置缓冲区的当前位置。在缓冲区类中,get和put方法用于读写缓冲区中的数据。get和put方法的定义如下:<p ><p >ByteBuffer类的get和put方法:<p ><p >public abstract byte get()            <p >public abstract ByteBuffer put(byte b) <p ><p >IntBuffer类的get和put方法:<p ><p >public abstract int get()            <p >public abstract IntBuffer put(int i) <p ><p >其他五个缓冲区类中的get和put方法定义和上面的定义类似,只是get方法返回相应的数据类型,而put方法的参数是相应的数据类型,并且返回值的类型是相应的缓冲区类。<p ><p >每当put方法向缓冲区写入一个数据后,缓冲区的当前位置都会加1。如果缓冲区的当前位置已经等于capacity,调用put方法就会抛出一个java.nio.BufferOverflowException异常。在缓冲区未初赋值的区域将被0填充。使用get方法可以得到缓冲区当前位置的数据,并使缓冲区的当前位置加1。和put方法一样,在缓冲区当前位置等于capacity时使用get方法也会抛出java.nio.BufferOverflowException异常。缓冲区的初始状态如图1所示。<p ><p ><center><img  src="http://www.hh010.com/upload_files/article/243/9_yu5lse1926383.jpg"></center><p ><center>图1 缓冲区的初始状态</center><p ><p >从图1可以看出,在缓冲区创建之初,当前的位置和缓冲区中的数据都为0。当使用如下语句向缓冲区中写入数据后,缓冲区当前状态如图2所示。<p ><p >byteBuffer.put((byte)2);<p >byteBuffer.put((byte)-1);<p ><p ><center><img  src="http://www.hh010.com/upload_files/article/243/9_vdftmc1926385.jpg"></center><p ><center>图2  缓冲区的当前状态</center><p ><p >当缓冲区的当前位置如图3所示时,使用put和get方法将会抛出上述的BufferOverflowException异常。<p ><p ><center><img  src="http://www.hh010.com/upload_files/article/243/9_ibeper1926387.jpg"></center><p ><center>图3  当前位置处于缓冲区尾</center><p ><p >如果要使用get方法得到缓冲区中的指定数据,必须将缓冲区的当前位置移动到指定的位置,我们可以使用position方法将当前位置移到缓冲区的任何位置。如下面的代码将图3所示的缓冲区的当前位置设为2,并用get方法获得位置2的数据:<p ><p >byteBuffer.position(2);<p >System.out.println(byteBuffer.get());<p ><p >上面的代码将输出3。缓冲区的当前位置为除了使用position方法,也可以使用rewind方法将缓冲区的当前位置设为0,rewind方法的定义如下:<p ><p >public final Buffer rewind()<p >在图2所示的缓冲区状态下调用rewind方法,就会得到如图4的缓冲区状态。<p ><p ><center><img  src="http://www.hh010.com/upload_files/article/243/9_bagsgt1926389.jpg"></center><p ><center>图4  调用rewind方法后的缓冲区状态</center><p ><p >接下来让我们执行如下语句:<p ><p >System.out.println(byteBuffer.get());<p ><p >缓冲区的状态将如图5所示。<p ><p ><center><img  src="http://www.hh010.com/upload_files/article/243/9_hqidne1926391.jpg"></center><p ><center>图5  调用get方法后的缓冲区状态</center><p align="center"><font color="FF0000" >1</font>2<span class="content01">下一页&gt;&gt;</span></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-25 12:31 , Processed in 0.083375 second(s), 23 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表