Java NIO Buffer (八)byte Buffer

举报
张俭 发表于 2023/12/29 15:18:53 2023/12/29
【摘要】 除了布尔类型,其他基本类型都有自身的Buffer类,但是byteBuffer还有不少其他特性。操作系统和他的IO设备来看,byte是最基本的数据单元。需要把其他类型的数据转化为bytes来操作。为了方便参阅,这里列出来了ByteBuffer的完整API。public abstract class ByteBuffer extends Buffer implements Comparable ...

除了布尔类型,其他基本类型都有自身的Buffer类,但是byteBuffer还有不少其他特性。操作系统和他的IO设备来看,byte是最基本的数据单元。需要把其他类型的数据转化为bytes来操作。为了方便参阅,这里列出来了ByteBuffer的完整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(  )
}

除了boolean类型之外,byte占1个byte,char两个,short两个,int四个,long八个,float四个,double八个。虽然这些字节一定是按照顺序的,但是也有大端和小端之分。(指的是连续的内存单元,先放高字节,还是先存放低字节)在java.nio中,字节顺序由ByteOrder这个类来封装

public final class ByteOrder {
  public static final ByteOrder BIG_ENDIAN
  public static final ByteOrder LITTLE_ENDIAN

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

这个类定义了两个自己实例的公共域,在JVM中,只有这两个实例,所以要比较的话,可以使用==。如果你需要知道JVM上的字节顺序,调用nativeOrder方法。

每一个buffer类都可以通过order方法知悉自己现在的字节顺序设置

  public final ByteOrder order()

返回ByteOrder的两个实现之一,但和ByteBuffer不同,这个返回的对象只是可读的。ByteBuffer的默认字节顺序是大根端(无论运行在什么字节顺序的平台上),Java的默认字节顺序也是大根端,允许类文件,序列化的对象运行在任何JVM上。如果本地的硬件设备是小根端的话,这可能会有着性能的影响。把ByteBuffer作为其他数据类型接受的时候,使用本地的字节顺序会更有效。

ByteBuffer的字节顺序可以通过order方法改变

  public final ByteOrder order()
  public final ByteOrder order(ByteOrder bo)

如果buffer被创建为ByteBuffer的一个视图,那么order返回的就是当这个buffer创建时,原来的buffer的字节顺序,即使原来的buffer改变字节顺序,buffer的字节顺序也不会改变。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。