当前位置: 首页 > news >正文

自助建站工具flash网站建设价格

自助建站工具,flash网站建设价格,WordPress HTML标签验证,宜家设计装修怎么收费Buffer其实就是是一个容器对象#xff0c;它包含一些要写入或者刚读出的数据。在NIO中加入Buffer对象#xff0c;体现了新库与原I/O的一个重要区别。在面向流的I/O中#xff0c;您将数据直接写入或者将数据直接读到Stream对象中。在NIO库中#xff0c;所有数据都是用缓冲区… Buffer其实就是是一个容器对象它包含一些要写入或者刚读出的数据。在NIO中加入Buffer对象体现了新库与原I/O的一个重要区别。在面向流的I/O中您将数据直接写入或者将数据直接读到Stream对象中。在NIO库中所有数据都是用缓冲区处理的。在读取数据时它是直接读到缓冲区中的。在写入数据时它是写入到缓冲区中的。任何时候访问NIO中的数据您都是将它放到缓冲区中。缓冲区实质上是一个数组。通常它是一个字节数组但是也可以使用其他种类的数组。但是一个缓冲区不仅仅是一个数组。缓冲区提供了对数据的结构化访问而且还可以跟踪系统的读/写进程。最常用的缓冲区类型是ByteBuffer。 一个ByteBuffer可以在其底层字节数组上进行get/set操作(即字节的获取和设置)。   ByteBuffer不是NIO中唯一的缓冲区类型。事实上对于每一种基本Java类型都有一种缓冲区类型(只有boolean类型没有其对应的缓冲区类)   ByteBuffer   CharBuffer   ShortBuffer   IntBuffer   LongBuffer   FloatBuffer   DoubleBuffer 每一个Buffer类都是Buffer接口的一个实例。 除了ByteBuffer 每一个Buffer类都有完全一样的操作只是它们所处理的数据类型不一样。因为大多数标准I/O操作都使用ByteBuffer所以它具有所有共享的 缓冲区操作以及一些特有的操作。我们来看一下Buffer的类层次图吧每个 Buffer 都有以下的属性capacity这个 Buffer 最多能放多少数据。 capacity 一般在 buffer 被创建的时候指定。limit在 Buffer 上进行的读写操作都不能越过这个下标。当写数据到 buffer 中时 limit 一般和 capacity 相等当读数据时 limit 代表 buffer 中有效数据的长度。positionposition变量跟踪了向缓冲区中写入了多少数据或者从缓冲区中读取了多少数据。更确切的说当您从通道中读取数据到缓冲区中时它指示了下一个数据将放到数组的哪一个元素中。比如如果您从通道中读三个字节到缓冲区中那么缓冲区的 position将会设置为3指向数组中第4个元素。反之当您从缓冲区中获取数据进行写通道时它指示了下一个数据来自数组的哪一个元素。比如当您 从缓冲区写了5个字节到通道中那么缓冲区的 position 将被设置为5指向数组的第六个元素。mark一个临时存放的位置下标。调用 mark() 会将 mark 设为当前的 position 的值以后调用 reset() 会将 position 属性设置为 mark 的值。 mark 的值总是小于等于 position 的值如果将 position 的值设的比 mark 小当前的 mark 值会被抛弃掉。这些属性总是满足以下条件0 mark position limit capacity缓冲区的内部实现机制下面我们就以数据从一个输入通道拷贝到一个输出通道为例来详细分析每一个变量并说明它们是如何协同工作的   初始变量   我们首先观察一个新创建的缓冲区以ByteBuffer为例假设缓冲区的大小为8个字节ByteBuffer初始状态如下   回想一下 limit决不能大于capacity此例中这两个值都被设置为8。我们通过将它们指向数组的尾部之后(第8个槽位)来说明这点。   我们再将position设置为0。表示如果我们读一些数据到缓冲区中那么下一个读取的数据就进入 slot 0。如果我们从缓冲区写一些数据从缓冲区读取的下一个字节就来自slot 0。position设置如下所示   由于缓冲区的最大数据容量capacity不会改变所以我们在下面的讨论中可以忽略它。   第一次读取   现在我们可以开始在新创建的缓冲区上进行读/写操作了。首先从输入通道中读一些数据到缓冲区中。第一次读取得到三个字节。它们被放到数组中从 position开始的位置这时position被设置为0。读完之后position就增加到了3如下所示limit没有改变。   第二次读取   在第二次读取时我们从输入通道读取另外两个字节到缓冲区中。这两个字节储存在由position所指定的位置上 position因而增加2limit没有改变。   flip   现在我们要将数据写到输出通道中。在这之前我们必须调用flip()方法。 其源代码如下    public final Buffer flip() {  limit  position;  position  0;  mark  -1;  return this;  }   这个方法做两件非常重要的事   i  它将limit设置为当前position。   ii 它将position设置为0。   上一个图显示了在flip之前缓冲区的情况。下面是在flip之后的缓冲区   我们现在可以将数据从缓冲区写入通道了。position被设置为0这意味着我们得到的下一个字节是第一个字节。limit已被设置为原来的position这意味着它包括以前读到的所有字节并且一个字节也不多。   第一次写入   在第一次写入时我们从缓冲区中取四个字节并将它们 写入输出通道。这使得position增加到4而limit不变如下所示   第二次写入   我们只剩下一个字节可写了。limit在我们调用flip()时被设置为5并且position不能超过limit。 所以最后一次写入操作从缓冲区取出一个字节并将它写入输出通道。这使得position增加到5并保持limit不变如下所示   clear   最后一步是调用缓冲区的clear()方法。这个方法重设缓冲区以便接收更多的字节。其源代码如下    public final Buffer clear() {  osition  0;  limit  capacity;  mark  -1;  return this;  }   clear做两种非常重要的事情    i 它将limit设置为与capacity相同。    ii 它设置position为0。    下图显示了在调用clear()后缓冲区的状态 此时缓冲区现在可以接收新的数据了。至此我们只是使用缓冲区将数据从一个通道转移到另一个通道然而程序经常需要直接处理数据。例如您可能需要将用户数据保存到磁盘。在这种情况下您必须将这些数据直接放入缓冲区然后用通道将缓冲区写入磁盘。 或者您可能想要从磁盘读取用户数据。在这种情况下您要将数据从通道读到缓冲区中然后检查缓冲区中的数据。实际上每一个基本类型的缓冲区都为我们提供了直接访问缓冲区中数据的方法我们以ByteBuffer为例分析如何使用其提供的get()和put()方法直接访问缓冲区中的数据。   a)    get()    ByteBuffer类中有四个get()方法byte get();   ByteBuffer get( byte dst[] );   ByteBuffer get( byte dst[], int offset, int length );   byte get( int index );第一个方法获取单个字节。第二和第三个方法将一组字节读到一个数组中。第四个方法从缓冲区中的特定位置获取字节。那些返回ByteBuffer的方法只是返回调用它们的缓冲区的this值。 此外我们认为前三个get()方法是相对的而最后一个方法是绝对的。“相对”意味着get()操作服从limit和position值更明确地说 字节是从当前position读取的而position在get之后会增加。另一方面一个“绝对”方法会忽略limit和position值也不会 影响它们。事实上它完全绕过了缓冲区的统计方法。 上面列出的方法对应于ByteBuffer类。其他类有等价的get()方法这些方法除了不是处理字节外其它方面是是完全一样的它们处理的是与该缓冲区类相适应的类型。注这里我们着重看一下第二和第三这两个方法ByteBuffer get( byte dst[] );   ByteBuffer get( byte dst[], int offset, int length );这两个get()主要用来进行批量的移动数据可供从缓冲区到数组进行的数据复制使用。第一种形式只将一个数组 作为参数将一个缓冲区释放到给定的数组。第二种形式使用 offset 和 length 参数来指 定目标数组的子区间。这些批量移动的合成效果与前文所讨论的循环是相同的但是这些方法 可能高效得多因为这种缓冲区实现能够利用本地代码或其他的优化来移动数据。buffer.get(myArray)    等价于buffer.get(myArray,0,myArray.length);注如果您所要求的数量的数据不能被传送那么不会有数据被传递缓冲区的状态保持不 变同时抛出 BufferUnderflowException 异常。因此当您传入一个数组并且没有指定长度您就相当于要求整个数组被填充。如果缓冲区中的数据不够完全填满数组您会得到一个 异常。这意味着如果您想将一个小型缓冲区传入一个大数组您需要明确地指定缓冲区中剩 余的数据长度。上面的第一个例子不会如您第一眼所推出的结论那样将缓冲区内剩余的数据 元素复制到数组的底部。例如下面的代码        String str  com.xiaoluo.nio.MultipartTransfer;ByteBuffer buffer  ByteBuffer.allocate(50);        for(int i  0; i  str.length(); i){buffer.put(str.getBytes()[i]);}buffer.flip();byte[] buffer2  new byte[100];buffer.get(buffer2);buffer.get(buffer2, 0, length);System.out.println(new String(buffer2));这里就会抛出java.nio.BufferUnderflowException异常因为数组希望缓存区的数据能将其填满如果填不满就会抛出异常所以代码应该改成下面这样        //得到缓冲区未读数据的长度length [] buffer2   [1000, length);b)    put()    ByteBuffer类中有五个put()方法    ByteBuffer put( byte b );  ByteBuffer put( byte src[] );  ByteBuffer put( byte src[], int offset, int length );  ByteBuffer put( ByteBuffer src );  ByteBuffer put( int index, byte b );第一个方法 写入put单个字节。第二和第三个方法写入来自一个数组的一组字节。第四个方法将数据从一个给定的源ByteBuffer写入这个 ByteBuffer。第五个方法将字节写入缓冲区中特定的 位置 。那些返回ByteBuffer的方法只是返回调用它们的缓冲区的this值。 与get()方法一样我们将把put()方法划分为“相对”或者“绝对”的。前四个方法是相对的而第五个方法是绝对的。上面显示的方法对应于ByteBuffer类。其他类有等价的put()方法这些方法除了不是处理字节之外其它方面是完全一样的。它们处理的是与该缓冲区类相适应的类型。c)    类型化的 get() 和 put() 方法    除了前些小节中描述的get()和put()方法 ByteBuffer还有用于读写不同类型的值的其他方法如下所示    getByte()    getChar()    getShort()    getInt()    getLong()    getFloat()    getDouble()    putByte()    putChar()    putShort()    putInt()    putLong()    putFloat()    putDouble()    事实上这其中的每个方法都有两种类型一种是相对的另一种是绝对的。它们对于读取格式化的二进制数据如图像文件的头部很有用。   下面的内部循环概括了使用缓冲区将数据从输入通道拷贝到输出通道的过程。        while(true){            //clear方法重设缓冲区可以读新内容到buffer里            buffer.clear();            int val  inChannel.read(buffer);            if(val  -1){                break;}            //flip方法让缓冲区的数据输出到新的通道里面            buffer.flip();outChannel.write(buffer);}   read()和write()调用得到了极大的简化因为许多工作细节都由缓冲区完成了。clear()和flip()方法用于让缓冲区在读和写之间切换。好了缓冲区的内容就暂且写到这里下一篇我们将继续NIO的学习--通道(Channel).  转载于:https://blog.51cto.com/3237526/1606323
http://www.pierceye.com/news/115681/

相关文章:

  • 网站运营与数据分析网站开发学习什么
  • 上海网站备案在哪里查询网站建设哪家稳妥
  • 建设网站做什么赚钱网站制作.
  • 小企业公司网站怎么建做网站英文编辑有前途吗
  • 优化图片传网站wordpress背景图片
  • 网站服务器哪家好些外包做网站不付尾款
  • 建站系统wordpress下载哪个公司的微信商城系统
  • 网站建设app开发合同深圳企业网站制作设计方案
  • 免费网站整站模板下载寻找做网站
  • 做此广告的网站做家纺的网站
  • 湖南畅想网站建设个人网站建设基本定位
  • 建站公司外包钓鱼网站怎么做
  • 个人网站logo需要备案吗鑫灵锐做网站多少钱
  • .xyz做网站怎么样网站产品预算
  • 建网站先要申请网址吗做网站给文件不侵权
  • 一元夺宝网站建设Wordpress 普通图片裁剪
  • 网站推广都有哪些自己有网站怎么优化
  • 宠物交易网站模板更改wordpress后台登录地址
  • 有电脑网站怎样建手机正规网络游戏平台
  • 网站抓取QQ获取系统cms监控手机客户端
  • 郑州网站推广价格优礼品网站模板
  • 百度指数不高的网站怎么优化网站图片类型
  • 北京专业做网站怎么样app软件开发摄像头
  • 网站建设导向erp系统软件免费版
  • 手表网站网站开发毕业设计文献综述
  • 台州网站制作维护关于微网站策划ppt怎么做
  • 网站建设中期目标开发app找那个公司
  • 跨境自建站模板网站内容和功能清单
  • 平面设计找素材的网站电子商务网站建设的步骤一般为(
  • 一个服务器可以备案几个网站凡科门店通怎么样