地区分类 数组 Java NIO 缓冲区基础二(4)

电脑杂谈  发布时间:2017-02-15 00:05:01  来源:网络整理

使用 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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 宋良英
      宋良英

      其实是因为中国在南海建了岛礁

    热点图片
    拼命载入中...