使用 allocateDirect方法就可以获得直接缓冲区。
public static ByteBuffer allocateDirect (int capacity)
public abstract boolean isDirect( );
isDirect对于直接缓冲区的非字节视图缓冲区,也可能返回true
5、视图缓冲区
可以这样理解,字节缓冲区是所有缓冲类型的基础。我们在通道中,网络中文件流中四处传递字节缓冲区。但是,一旦进入应用,我们就要通过视图缓冲区来解读具体的数据了。
字节缓冲区提供了很多这样的API
public abstract class ByteBuffer
extends Buffer implements Comparable {
// This is a partial API listing
public abstract CharBuffer asCharBuffer( );
public abstract ShortBuffer asShortBuffer( );
public abstract IntBuffer asIntBuffer( );
public abstract LongBuffer asLongBuffer( );
public abstract FloatBuffer asFloatBuffer( );
public abstract DoubleBuffer asDoubleBuffer( );
}
前面提到过从ByteBuffer到IntBuffer的转换。其实这种转换,是一种解释包装。
所以需要提供一个顺序,然后按照顺序和类型,转换成另外一种视图,而原始数据其实是不变的。
例如,我们可以这样;
ByteBuffer byteBuffer =
ByteBuffer.allocate(7).order(ByteOrder.BIG_ENDIAN);
CharBuffer charBuffer = byteBuffer.asCharBuffer();
注意,java中char是占两个字节的。我们的转换可以看下图:

新的charBuffer视图其实还是使用的原来的缓冲区的数据,只是这时的元素变成了2个字节的char了。
看一段代码:
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.CharBuffer;
public class CharBufferView {
public static void print(Buffer buffer){
System.out.println("pos="+buffer.position()+", limit="+
buffer.limit() + ", capacity="+buffer.capacity()
+":'" + buffer.toString()+"'");
}
public static void main(String[] args)
throws Exception{
ByteBuffer byteBuffer = ByteBuffer.allocate(8).order(ByteOrder.BIG_ENDIAN);
CharBuffer charBuffer = byteBuffer.asCharBuffer();
byteBuffer.put(0,(byte)0);
byteBuffer.put(1,(byte)'H');
byteBuffer.put(2,(byte)0);
byteBuffer.put(3,(byte)'e');
byteBuffer.put(4,(byte)0);
byteBuffer.put(5,(byte)'l');
byteBuffer.put(6,(byte)0);
byteBuffer.put(7,(byte)'l');
byteBuffer.put(8,(byte)0);
byteBuffer.put(9,(byte)'o');
CharBufferView.print(byteBuffer);
CharBufferView.print(charBuffer);
}
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32465-4.html
其实是因为中国在南海建了岛礁