一、首先是JavaDocument:
直接与非直接缓冲区
字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,则 Java 虚拟机会尽最大努力直接在此缓冲区上执行本机 I/O 操作。也就是说,在每次调用基础操作系统的一个本机 I/O 操作之前(或之后),虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中(或从中间缓冲区中复制内容)。
直接字节缓冲区可以通过调用此类的 allocateDirect 工厂方法来创建。此方法返回的缓冲区进行分配和取消分配所需成本通常高于非直接缓冲区。直接缓冲区的内容可以驻留在常规的垃圾回收堆之外,因此,它们对应用程序的内存需求量造成的影响可能并不明显。所以,建议将直接缓冲区主要分配给那些易受基础系统的本机 I/O 操作影响的大型、持久的缓冲区。一般情况下,最好仅在直接缓冲区能在程序性能方面带来明显好处时分配它们。

二、allocateDirect
public static ByteBuffer allocateDirect(int capacity)分配新的直接字节缓冲区。新缓冲区的位置将为零,其界限将为其容量,其标记是不确定的。无论它是否具有底层实现数组,其标记都是不确定的。
参数:
capacity - 新缓冲区的容量,以字节为单位
返回:
新的字节缓冲区
抛出:
IllegalArgumentException - 如果 capacity 为负整数

三、allocate 方法:
分配一个HeapByteBuffer的实例,其底层是byte数组。

在使用ByteBuffer 分配字节数组的时候,要注意使用!

一、ByteBuffer类
1) 实例化
直接使用ByteBuffer类的静态方法static ByteBuffer allocate(int capacity) 或 static ByteBuffer allocateDirect(int capacity) 这两个方法来分配内存空间,两种方法的区别主要是后者更适用于繁复分配的字节数组。而 put(ByteBuffer src) 可以从另一个ByteBuffer中构造,也可以通过wrap方法从byte[]中构造,具体参考下面的类型转化内容。
2) 类型转化
ByteBuffer可以很好的和字节数组byte[]转换类型,通过执行ByteBuffer类的final byte[] array() 方法就可以将ByteBuffer转为byte[]。从byte[]来构造ByteBuffer可以使用wrap方法,目前Android或者说Java提供了两种重写方法,比如为static ByteBuffer wrap(byte[] array) 和 static ByteBuffer wrap(byte[] array, int start, int len) ,第二个重载方法中第二个参数为从array这个字节数组的起初位置,第三个参数为array这个字节数组的长度。
3) 往ByteBuffer中添加元素
目前ByteBuffer提供了多种put重写类型来添加,比如put(byte b) 、putChar(char value) 、putFloat(float value) 等等,需要注意的是,按照Java的类型长度,一个byte占1字节,一个char类型是2字节,一个float或int是4字节,一个long则为8字节,和传统的C++有些区别。所以内部的相关位置也会发生变化,同时每种方法还提供了定位的方法比如ByteBuffer put(int index, byte b)
4) 从ByteBuffer中获取元素
同上面的添加想法,各种put被换成了get,比如byte get() 、float getFloat() ,当然了还提供了一种定位的方式,比如double getDouble(int index)
5) ByteBuffer中字节顺序
对于Java来说默认使用了BIG_ENDIAN方式存储,和C正好相反的,通过
final ByteOrder order() 返回当前的字节顺序。
final ByteBuffer order(ByteOrder byteOrder) 设置字节顺序,ByteOrder类的值有两个定义,比如LITTLE_ENDIAN、BIG_ENDIAN,如果使用当前平台则为ByteOrder.nativeOrder()在Android中则为 BIG_ENDIAN,当然如果设置为order(null) 则使用LITTLE_ENDIAN。

ByteBuffer.allocateDirect 与 allocate 方法相关推荐

  1. ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...

  2. ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别。

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...

  3. ByteBuffer.allocate()/ByteBuffer.allocateDirect()/JNI DETECTED ERROR IN APPLICATION: jarray was NULL

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...

  4. ByteBuffer的allocate()方法详解

    ByteBuffer的allocate()方法详解 allocate()方法用于分配缓冲区.但是如果是聚集写入,与分散读取,就需要注意这个大小设置, String property = System. ...

  5. ByteBuffer中的allocate和allocateDirect

    1.区别 allocate方法创建的内存在jvm的管理范围,而allocateDirect方法创建的内存不由jvm管理,意思就是allocateDirect创建的内存由系统直接管理 2.释放 allo ...

  6. java使用ByteBuffer.allocateDirect分配的堆外内存大小查看方法

    一.问题 在java开发中,可以使用ByteBuffer.allocateDirect分配的堆外内存,那么对一个java程序来说,如何实时查看进程的堆外内存大小呢? 二.本机进程 1.使用Jvisua ...

  7. 03 Java NIO allocateDirect()和allocate()区别

    03 Java NIO allocateDirect和allocate区别 allocateDirect()和allocate()区别 直接与非直接缓冲区 直接与非直接缓冲区 源码分析 allocat ...

  8. ByteBuffer.allocateDirect函数分析

    在NIO中,有两种分配字节的方法: 在堆中初始缓冲区 public static ByteBuffer allocate(int capacity) {if (capacity < 0)thro ...

  9. java中静态缓冲区,java中allocatedirect和allocate字节缓冲区的联系与区别

    一.字节缓冲区方法allocateDirect()和allocate()简介 当Java程序员在编写相应的Java应用时一般都不会用到字节,所以大家对byte字节的了解也是知之甚少,但是当我们随着工作 ...

最新文章

  1. ubuntu 设置开机执行脚本_ubuntu-18.04 设置开机启动脚本
  2. html 辅助标签,工作总结 @Html 辅助方法 为 生成的 标签设置元素属性 htmlAttributes 一个对象,其中包含要为该元素设置的 HTML 特性。...
  3. C++五子棋(六)——游戏结束
  4. python中set和dict类型_python从菜鸟到小仙的成长之路-----Dict和Set类型篇
  5. linux下配置DHCP中继代理
  6. seo html空格影响,这一对HTML标签嵌套对SEO优化的影响,居然99%的人不知道!
  7. 4步win7下简单FTP服务器搭建(试验成功)
  8. Python程序互斥体
  9. android日期选择滚轮框架,GitHub - liwenzhi/wheelview: 滚轮效果的View,日期选择器
  10. 小程序如何实现tab切换,一部到位
  11. Flink 在人工智能领域的应用实践
  12. one hot encoding
  13. 中国银行业100强名单发布
  14. android快牙原理,快牙的使用原理是什么_快牙怎么使用_3DM手游
  15. 【1】Kali破解家用WI-FI密码 - WEP加密
  16. 几款入夏品牌包包可以看看
  17. 百度网盘不限速方法 直接跑满带宽
  18. Python 练习实例100例—8
  19. 多节点OpenStack Charms 部署指南0.0.1.dev--42--部署bundle openstack-base-78,单网口openstack网络,及注意:千万不能以数字开头命名主机名
  20. 蓝桥杯-第九届决赛——采油

热门文章

  1. 信息增益比 vs 信息增益
  2. 做了三年前端,你才知道10分钟就能实现一个PC版魔方游戏
  3. MT6177 RF_datasheet资料介绍
  4. 未来也许不一定只存在几种底层公链
  5. 如何构建更加高效、准确的对话模型:ChatGPT和大规模预训练模型
  6. SQL server中删除synonym时报不存在,或者您没有所需的权限
  7. 没了乔布斯,苹果还甜吗?
  8. 使用MPEG4IP_mp4v2实现3GP文件合成
  9. D3D入门-D3D介绍
  10. 面向对象:9、static关键字