Liny_@NotePad

沉迷ACG中

nio.Buffer小记

YOYO posted @ 2009年11月10日 19:43 in 【Java SE】 with tags nio Buffer , 1995 阅读

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

看了下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会被清空:

  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((byte) 1);
  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, (byte) 3);
  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((byte) 1, 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((byte) 3, buffer.get(5));
  79.                 assertEquals(10, buffer.capacity());
  80.                 assertEquals(10, buffer.limit());
  81.                 assertEquals(0, buffer.position());
  82.         }
  83.        
  84. }

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter