nio.Buffer小记

来源:互联网 发布:犀牛软件模型免费下载 编辑:程序博客网 时间:2024/05/16 07:27

完全用数组来理解。。@ _ @

看了下Buffer的源码 居然跟想象的差不多也 ^^,的确是用数组存储,不过米有找到get和put的源码……

用数组来理解几个参数……:

  • capacity:容量,相当于数组大小
  • limit:有效个数,相当于字符串数组中'/0'的位置
  • position:当前位置,遍历字符串数组时循环变量i的位置^^
  • mark:标记,用于记忆位,与mark()、reset()方法搭配使用。

继续用数组来理解几个方法。。假设数据数组为data吧。。

  • get():得到当前位置的值 同时指针往后移位。如果操作时position==limit则会抛出异常
    1. int value = data[position];
    2. ++position;
    3. return value;
  • get(int i) :得到i位置的值,如果i==limit则会抛出异常。
    1. if (i < capacity) return data[i];
  • put(int value) :存储到当前位置,如果操作时position==limit则会抛出异常
    1. data[position] = value;
    2. ++position;
  • put(int i, int value) :改变i位置的值,如果i==limit则会抛出异常。
    1. data[i] = value;
  • clear():从头开始读,0~capacity范围均可更改。
    1. limit = capacity;
    2. position = 0;
    3. mark = -1;
  • flip() :锁定了原position~capacity区间的值不可更改,操作只限于0~position位置。一般在读取之前使用。
    1. limit = position;
    2. position = 0;
    3. mark = -1;
  • rewind():从行首开始读,直接把指针挪到0位置。一般用于重新读入。
    1. position = 0;
    2. mark = -1;
  • hasRemaining():判断是否到达末尾
    1. return position < limit;
  • remaining():获得剩余有效元素个数
    1. return limit - position;
  • mark():标记当前位置
    1. mark = position;
  • reset():还原当前位置到标记位置。当mark为-1时会抛出异常。
    1. position = mark;

 附ByteBuffer的测试类,要注意position(int i)时mark大于新pos的话,mark会被清空:
 

Code:
  1. package org.yoyo.nio.socket;   
  2.     
  3. import java.nio.ByteBuffer;   
  4.     
  5. import junit.framework.TestCase;   
  6.     
  7. public class Test extends TestCase {   
  8.           
  9.         private static ByteBuffer buffer = ByteBuffer.allocate(10);   
  10.           
  11.         public void testPut() {   
  12.                 buffer.put((byte1);   
  13.                 assertEquals(10, buffer.capacity());   
  14.                 assertEquals(10, buffer.limit());   
  15.                 assertEquals(1, buffer.position());   
  16.         }   
  17.           
  18.         public void testPutIndex() {   
  19.                 buffer.put(5, (byte3);   
  20.                 assertEquals(10, buffer.capacity());   
  21.                 assertEquals(10, buffer.limit());   
  22.                 assertEquals(1, buffer.position());   
  23.         }   
  24.           
  25.         public void testPosition() {   
  26.                 buffer.position(5);   
  27.                 assertEquals(10, buffer.capacity());   
  28.                 assertEquals(10, buffer.limit());   
  29.                 assertEquals(5, buffer.position());   
  30.         }   
  31.           
  32.         public void testMarkAndReset() {   
  33.                 buffer.mark();   
  34.                 assertEquals(10, buffer.capacity());   
  35.                 assertEquals(10, buffer.limit());   
  36.                 assertEquals(5, buffer.position());   
  37.                   
  38.                 buffer.position(7);   
  39.                 assertEquals(10, buffer.capacity());   
  40.                 assertEquals(10, buffer.limit());   
  41.                 assertEquals(7, buffer.position());   
  42.                   
  43.                 buffer.reset();   
  44.                 assertEquals(10, buffer.capacity());   
  45.                 assertEquals(10, buffer.limit());   
  46.                 assertEquals(5, buffer.position());   
  47.         }   
  48.           
  49.         public void testFlip() {   
  50.                 buffer.flip();   
  51.                 assertEquals(10, buffer.capacity());   
  52.                 assertEquals(5, buffer.limit());   
  53.                 assertEquals(0, buffer.position());   
  54.         }   
  55.           
  56.         public void testGet() {   
  57.                 assertEquals((byte1, buffer.get());   
  58.                 assertEquals(10, buffer.capacity());   
  59.                 assertEquals(5, buffer.limit());   
  60.                 assertEquals(1, buffer.position());   
  61.         }   
  62.           
  63.         public void testRewind() {   
  64.                 buffer.rewind();   
  65.                 assertEquals(10, buffer.capacity());   
  66.                 assertEquals(5, buffer.limit());   
  67.                 assertEquals(0, buffer.position());   
  68.         }   
  69.     
  70.         public void testClear() {   
  71.                 buffer.clear();   
  72.                 assertEquals(10, buffer.capacity());   
  73.                 assertEquals(10, buffer.limit());   
  74.                 assertEquals(0, buffer.position());   
  75.         }   
  76.           
  77.         public void testGetIndex() {   
  78.                 assertEquals((byte3, buffer.get(5));   
  79.                 assertEquals(10, buffer.capacity());   
  80.                 assertEquals(10, buffer.limit());   
  81.                 assertEquals(0, buffer.position());   
  82.         }   
  83.           
  84. }  

 

原创粉丝点击