分享

Java nio入门教程详解(十)

 360lec 2016-09-30

2.4.4 数据元素视图

ByteBuffer 类提供了一个不太重要的机制来以多字节数据类型的形式存取byte数据组。ByteBuffer类为每一种原始数据类型提供了存取的和转化的方法:

  1. public abstract class ByteBuffer extends Buffer implements Comparable
  2. {
  3. public abstract char getChar();
  4. public abstract char getChar (int index);
  5. public abstract short getShort();
  6. public abstract short getShort (int index);
  7. public abstract int getInt();
  8. public abstract int getInt (int index);
  9. public abstract long getLong();
  10. public abstract long getLong (int index);
  11. public abstract float getFloat();
  12. public abstract float getFloat (int index);
  13. public abstract double getDouble();
  14. public abstract double getDouble (int index);
  15. public abstract ByteBuffer putChar (char value);
  16. public abstract ByteBuffer putChar (int index, char value);
  17. public abstract ByteBuffer putShort (short value);
  18. public abstract ByteBuffer putShort (int index, short value);
  19. public abstract ByteBuffer putInt (int value);
  20. public abstract ByteBuffer putInt (int index, int value);
  21. public abstract ByteBuffer putLong (long value);
  22. public abstract ByteBuffer putLong (int index, long value);
  23. public abstract ByteBuffer putFloat (float value);
  24. public abstract ByteBuffer putFloat (int index, float value);
  25. public abstract ByteBuffer putDouble (double value);
  26. public abstract ByteBuffer putDouble (int index, double value);
  27. }

这些函数从当前位置开始存取ByteBuffer的字节数据,就好像一个数据元素被存储在那里一样。根据这个缓冲区的当前的有效的字节顺序,这些字节数据会被排列或打乱成需要的原始数据类型。比如说,如果getInt()函数被调用,从当前的位置开始的四个字节会被包装成一个int类型的变量然后作为函数的返回值返回。参见 2.4.1 节。

假设一个叫buffer的ByteBuffer对象处于图 Figure 2-17 的状态。

图 2-17. 包含一些数据的 ByteBuffer图 2-17. 包含一些数据的 ByteBuffer

这段代码:

int value = buffer.getInt();

会返回一个由缓冲区中位置1-4的byte数据值组成的int型变量的值。实际的返回值取决于缓冲区的当前的比特排序(byte-order)设置。更具体的写法是:

int value = buffer.order (ByteOrder.BIG_ENDIAN).getInt();

这将会返回值 0x3BC5315E,同时:

int value = buffer.order (ByteOrder.LITTLE_ENDIAN).getInt();

返回值 0x5E31C53B。 如果您试图获取的原始类型需要比缓冲区中存在的字节数更多的字节,会抛出BufferUnderflowException。对于图 Figure2-17 中的缓冲区,这段代码会抛出异常,因为一个long型变量是8个字节的,但是缓冲区中只有5个字节:

long value = buffer.getLong();

这些函数返回的元素不需要被任何特定模块界限所限制。数值将会从以缓冲区的当前位置开始的字节缓冲区中取出并组合,无论字组是否对齐。这样的做法是低效的,但是它允许对一个字节流中的数据进行随机的放置。对于从二进制文件数据或者包装数据成特定平台的格式或者导出到外部的系统,这将是非常有用的。

put 函数提供与 get 相反的操作。原始数据的值会根据字节顺序被分拆成一个个byte数据。如果存储这些字节数据的空间不够,会抛出BufferOverflowException

每一个函数都有重载的和无参数的形式。重载的函数对位置属性加上特定的字节数。然后无参数的形式则不改变位置属性。

Java nio入门教程详解(十一)

0 0
我们认为:用户的主要目的,是为了获取有用的信息,而不是来点击广告的。因此本站将竭力做好内容,并将广告和内容进行分离,确保所有广告不会影响到用户的正常阅读体验。用户仅凭个人意愿和兴趣爱好点击广告。
我们坚信:只有给用户带来价值,用户才会给我们以回报。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多