Java Nio Buffer 三

2018/01/02 Java

Java Nio Buffer 三

这一次主要记录和CharBuffer相关的细节,因为这是Buffer中运用最多的类。 附上完整API:

public abstract class ByteBuffer extends Buffer
          implements Comparable{
        public static ByteBuffer allocate (int capacity)
        public static ByteBuffer allocateDirect (int capacity)
        public abstract boolean isDirect( );
        public static ByteBuffer wrap (byte[] array, int offset, int length) 
        public static ByteBuffer wrap (byte[] array)
        public abstract ByteBuffer duplicate( );

        public abstract ByteBuffer asReadOnlyBuffer( ); 
        public abstract ByteBuffer slice( );
        public final boolean hasArray( )
        public final byte [] array( )
        public final int arrayOffset( )
        public abstract byte get( );
        public abstract byte get (int index);
        public ByteBuffer get (byte[] dst, int offset, int length) 
        public ByteBuffer get (byte[] dst, int offset, int length)
        public abstract ByteBuffer put (byte b);
        public abstract ByteBuffer put (int index, byte b);
        public ByteBuffer put (ByteBuffer src)
        public ByteBuffer put (byte[] src, int offset, int length)
        public final ByteBuffer put (byte[] src)
        public final ByteOrder order( )
        public final ByteBuffer order (ByteOrder bo)
        public abstract CharBuffer asCharBuffer( ); 
        public abstract ShortBuffer asShortBuffer( ); 
        public abstract IntBuffer asIntBuffer( ); 
        public abstract LongBuffer asLongBuffer( ); 
        public abstract FloatBuffer asFloatBuffer( ); 
        public abstract DoubleBuffer asDoubleBuffer( );

        public abstract char getChar( );
        public abstract char getChar (int index);
        public abstract ByteBuffer putChar (char value);
        public abstract ByteBuffer putChar (int index, char value);
        public abstract short getShort( );
        public abstract short getShort (int index);
        public abstract ByteBuffer putShort (short value);
        public abstract ByteBuffer putShort (int index, short value);
        public abstract int getInt( );
        public abstract int getInt (int index);
        public abstract ByteBuffer putInt (int value);
        public abstract ByteBuffer putInt (int index, int value);
        public abstract long getLong( );
        public abstract long getLong (int index);
        public abstract ByteBuffer putLong (long value);
        public abstract ByteBuffer putLong (int index, long value);
        public abstract float getFloat( );
        public abstract float getFloat (int index); 
        public abstract ByteBuffer putFloat (float value);
        public abstract ByteBuffer putFloat (int index, float value);
        public abstract double getDouble( );
        public abstract double getDouble (int index);
        public abstract ByteBuffer putDouble (double value);
        public abstract ByteBuffer putDouble (int index, double value);
        public abstract ByteBuffer compact( ); 
        public boolean equals (Object ob) ;
        public int compareTo (Object ob) ; 
        public String toString( );
        public int hashCode( ) ;
}

目前,字节几乎被广泛认为是八个比特位。但这并非一直是实情。在过去的 时代,每个字节可以是 3 到 12 之间任何个数或者更多个的比特位,最常见的是 6 到 9 位。八位的字节来自于市场力量和实践的结合。它之所以实用是因为 8 位 足以表达可用的字符集(至少是英文字符),8 是 2 的三次乘方(这简化了硬件 设计),八恰好容纳两个十六进制数字,而且 8 的倍数提供了足够的组合位来存 储有效的数值。市场力量是 IBM。在 1960 年首先推出的 IBM360 大型机使用的 就是 8 位字节。这已经足够解决这个问题了。要想知道更多的背景,您可以去咨 询 IBM 的 鲍 勃 · 贝 莫 本 人 , 他 的 网 站 是 :http://www.bobbemer.com/BYTE.HTM

字节顺序

非字节类型的基本类型中,除了布尔型都是由几个组合在一起的字节组成的,这些数据类型和大小总结在下表中:

数据类型 大小(字节)
Byte 1
Char 2
Short 2
Int 4
Long 8
Float 4
Double 8

每个基本数据类型都是以连续字节序列的形式存储在内存中。字节大小已经被确定, 但字节顺序问题一直没有被广泛认同。

大端字节顺序如图: 大端字节顺序

小端字节顺序如图: 小端字节顺序

多字节数值被存储在内存中的方式一般被称为 endian-ness(字节顺序)。如果数字数值的最高字节——big end(大端),位于低位地址,那么系统就是大端字节顺序。如果最低字节最先保存在内存中,那么小端字节顺序。 字节顺序很少由软件设计者决定;它通常取决于硬件设计。字节顺序的两种类型有时被称为字节性别,在当今被广泛使用。两种方式都具有自身的优势。Intel 处理器使用小端字节顺序。摩托罗拉的 CPU 系列、SUN 的 Sparc 工作站,以及 PowerPC 的 CPU 架构都采用大端字节顺序。 字节顺序的问题甚至胜过CPU硬件设计。当Internet的设计者为互联各种类型的计算机而设计网际协议(IP)时,他们意识到了在具有不同内部字节顺序的系统间传递数值数据的问题。因此,IP协议规定了使用大端的网络字节顺序概念。所有在IP分组报文的协议部分中使用的多字节数值必须先在本地主机字节顺序和通用的网络字节顺序之间进行转换。 Java中字节顺序由ByteOrder类封装。

package java.nio;
public final class ByteOrder
{
        public static final ByteOrder BIG_ENDIAN
        public static final ByteOrder LITTLE_ENDIAN

        public static ByteOrder nativeOrder( ) 
        public String toString( )
}

这个函数从 ByteOrder 返回两个常量之一。对于除了 ByteOrder 之外的其他缓冲区 类,字节顺序是一个只读属性,并且可能根据缓冲区的建立方式而采用不同的值。除了ByteBuffer,其他通过分配或包装一个数组所创建的缓冲区将从 order()返回与 ByteOrder.nativeOrder()相同的数值。因为包含在缓冲区中的元素在 JVM 中将会被 作为基本数据直接存取。 ByteBuffer 类有所不同:默认字节顺序总是 ByteBuffer.BIG_ENDIAN,无论系统的固有字节顺序是什么。Java 的默认字节顺序是大端字节顺序,这允许类文件等以及串行化的对象可以在任何 JVM 中工作。如果固有硬件字节顺序是小端,这会有性能隐患。在使用固有硬件字节顺序时,将 ByteBuffer 的内容当作其他数据类型存取很可能高效得多。 ByteBuffer 的字符顺序设定可以随时通过调用以 ByteOrder.BIG_ENDIAN ByteOrder.LITTL_ENDIAN 为参数的 order()函数来改变。 如果一个缓冲区被创建为一个 ByteBuffer 对象的视图,那么 order() 返回的数值就是视图被创建时其创建源头的 ByteBuffer 的字节顺序设定。视图的字节顺序设定在创建后不能被改变,而且如果原始的字节缓冲区的字节顺序在之后被改变,它也不会受到影响。

Show Disqus Comments

Search

    Table of Contents