从头认识java-16.6 ByteBuffer是怎样存储的?

这一章节我们来讨论一下ByteBuffer是怎样存储的?

1.例子:

package com.ray.ch16;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.IntBuffer;
import java.nio.LongBuffer;

public class Test {

	public static void main(String[] args) throws IOException {
		ByteBuffer buffer = ByteBuffer.allocate(16);
		CharBuffer charBuffer = buffer.asCharBuffer();
		charBuffer.put(new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' });
		charBuffer.rewind();
		while (charBuffer.hasRemaining()) {
			System.out.print(charBuffer.position() + "->" + charBuffer.get()
					+ " ");
		}
		System.out.println();
		IntBuffer intBuffer = buffer.asIntBuffer();
		intBuffer.put(new int[] { 1, 2, 3, 4 });
		intBuffer.rewind();
		while (intBuffer.hasRemaining()) {
			System.out.print(intBuffer.position() + "->" + intBuffer.get()
					+ " ");
		}
		System.out.println();
		LongBuffer longBuffer = buffer.asLongBuffer();
		longBuffer.put(new long[] { 1, 2 });
		longBuffer.rewind();
		while (longBuffer.hasRemaining()) {
			System.out.print(longBuffer.position() + "->" + longBuffer.get()
					+ " ");
		}
	}
}

输出:

0->a 1->b 2->c 3->d 4->e 5->f 6->g 7->h 
0->1 1->2 2->3 3->4 
0->1 1->2 

解释一下,为什么上面的数据越来越少,因为每一个类别所占据的位数是不一样的,而buffer是包装了一个16位的数组,因此会出现这种情况。


2.buffer的存储是怎样的呢?


按照每一个类型的存储字节数不同,我们可以得出上面的图示。

第一种是char,第二种是int,第三种是long

其实XXXBuffer就是保证了一个规定长度的数组,如果超过这个长度,会抛异常。


3.通过参数来控制存储顺序

package com.ray.ch16;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.CharBuffer;
import java.util.Arrays;

public class Test {

	public static void main(String[] args) throws IOException {
		ByteBuffer buffer = ByteBuffer.allocate(16);
		buffer.order(ByteOrder.BIG_ENDIAN);
		CharBuffer charBuffer = buffer.asCharBuffer();
		charBuffer.put("abcdefg");
		System.out.println(Arrays.toString(buffer.array()));
		System.out.println();
		buffer.order(ByteOrder.LITTLE_ENDIAN);
		charBuffer = buffer.asCharBuffer();
		charBuffer.put("abcdefg");
		System.out.println(Arrays.toString(buffer.array()));
	}
}

输出:

[0, 97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102, 0, 103, 0, 0]


[97, 0, 98, 0, 99, 0, 100, 0, 101, 0, 102, 0, 103, 0, 0, 0]


观察上面的代码,我们在里面加入了order来控制存储的顺序,从输出结果可以看出来。


总结:这一章节主要讨论了ByteBuffer是怎样存储的。


这一章节就到这里,谢谢。

-----------------------------------

目录



你可能感兴趣的:(java)