Java: CharBuffer "игнорирует" смещение массива? - PullRequest
1 голос
/ 21 июня 2010

Пожалуйста, помогите мне понять следующее:

Я создаю CharBuffer, используя CharBuffer.wrapped(new char[12], 2, 10) (массив, смещение, длина)
, поэтому я ожидаю, что доступ к массиву будет иметь смещение 2 и общая длина (отдых) 10.Но arrayOffset() возвращает 0.

Я хочу понять (и не могу понять из JavaDoc):

  • , когда arrayOffset() нет0 и

  • есть ли возможность разрешить CharBuffer использовать массив с "реальным" смещением (чтобы к этому массиву никогда не осуществлялся доступ до этого смещения)?

Вот небольшой тестовый пример:

import java.nio.*;
import java.util.*;
import org.junit.*;

public class _CharBufferTests {

  public _CharBufferTests() {
  }

  private static void printBufferInfo(CharBuffer b) {
    System.out.println("- - - - - - - - - - - - - - -");
    System.out.println("capacity: " + b.capacity());
    System.out.println("length: " + b.length());
    System.out.println("arrayOffset: " + b.arrayOffset());
    System.out.println("limit: " + b.limit());
    System.out.println("position: " + b.position());
    System.out.println("remaining: " + b.remaining());
    System.out.print("content from array: ");

    char[] array = b.array();
    for (int i = 0; i < array.length; ++i) {
        if (array[i] == 0) {
            array[i] = '_';
        }
    }

    System.out.println(Arrays.toString(b.array()));
  }

  @Test
  public void testCharBuffer3() {
    CharBuffer b = CharBuffer.wrap(new char[12], 2, 10);
    printBufferInfo(b);
    b.put("abc");
    printBufferInfo(b);
    b.rewind();
    b.put("abcd");
    printBufferInfo(b);
  }

}

Вывод:

- - - - - - - - - - - - - - -
capacity: 12
length: 10
arrayOffset: 0
limit: 12
position: 2
remaining: 10
content from array: [_, _, _, _, _, _, _, _, _, _, _, _]
- - - - - - - - - - - - - - -
capacity: 12
length: 7
arrayOffset: 0
limit: 12
position: 5
remaining: 7
content from array: [_, _, a, b, c, _, _, _, _, _, _, _]
- - - - - - - - - - - - - - -
capacity: 12
length: 8
arrayOffset: 0
limit: 12
position: 4
remaining: 8
content from array: [a, b, c, d, c, _, _, _, _, _, _, _]

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 июня 2010

Вы можете использовать position для достижения аналогичных результатов, я думаю. Не используйте rewind, поскольку это устанавливает position в 0; используйте reset вместо.

1 голос
/ 21 июня 2010

CharBuffer.wrap(char[], int, int):

Его вспомогательным массивом будет данный массив, а его смещение массива будет равно нулю.

Изучение записи в CharBuffer.offset похоже, что HeapCharBuffer и StringCharBuffer могут иметь ненулевые функции arrayOffsets ().

...