2010-06-21 8 views
1

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

я создаю 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, _, _, _, _, _, _, _] 

Спасибо!

ответ

1

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

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

экспертизы записи на CharBuffer.offset это выглядит как HeapCharBuffer и StringCharBuffer могут оба имеют ненулевые arrayOffsets().

1

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

+0

Вы правы! Это, действительно, подразумевало различное поведение. –

Смежные вопросы