本文章来自于本人个人博客:java nio 缓冲区(二)

一,创建缓冲区

1.缓冲区的创建有两种方式,分别是ByteBuffer.allocate([int])或者ByteBuffer.wrap(byte[]),第一种方式是创建一个分配了int个字节的缓冲区,而第二种方式是在现有字节数组之上创建一个缓冲区,这个缓冲区的capacity就是数组的长度。

2.Buffer类的其它子类创建缓冲区也是一样的:CharBuffer.allocate(int)或者CharBuffer.wrap(byte[])

二,缓冲区复制

缓冲区的复制有两个方法:duplicate()和slice(),duplicate方法会创建一个新的buffer,并且与原始buffer共同指向同一个内存区域;slice()方法是在调用buffer.position(4).limit(21)后调用buffer.slice()将截取缓冲区4-21之间的字节数组。

三,字节缓冲区

1.字节顺序

在缓冲区中,字节顺序被称为大端字节和小端字节。大端字节的意思是将一个数值的字节按照正常的顺序读取方式读入缓冲区,小端字节是讲一个数值的字节按照高位在前地位在后的顺序读进内存,例如:5870099的十进制值为:0x037fb4c7,这是正常顺序,跟我们平常使用的一样,此为大端字节,而如果使用小端字节,则输出将是0xc7b47f03。

四,直接缓冲区

在java中,数组是对象,而数据存储在对象中的方式在不同JVM实现中都各有不同。处于这一原因,引入了直接缓冲区概念。直接缓冲区被用于与佟冬和固有I/O进程交互,他们通过使用固有代码来告知操作系统直接释放或填充内存区域,对用于佟冬直接或原始存取的内存区域中的字节元素的存储尽了最大的努力。

直接字节缓冲区通常是I/O操作最好的选择,在设计方面,它们支持JVM可用的最高效I/O机制,非直接字节缓冲区可以被传递给通道,但是这样可能导致性能损耗。通常非直接缓冲不可能成为一个本地I/O操作目标。如果向一个非直接缓冲中写入数据,则调用方式如下步骤:

1.创建一个临时的直接ByteBuffer对象

2.将非直接缓冲区的内容复制到临时缓冲中

3.使用临时缓冲区执行低层次I/O操作

4.临时缓冲区对象离开作用域,并最终成为被回收的无用数据

从上面的步骤可以知道,非直接缓冲区在读写内存时,是通过一个临时的直接缓冲区的桥接来进行的,但是对于直接缓冲区,每一次的创建都会消耗很大的资源,这无疑加重了程序的负担。

直接缓冲区使用的内存是通过调用本地操作系统方面的代码分配的,绕过了标准JVM堆栈。建立和销毁直接缓冲区会明显比具有堆栈的缓冲区更加破费,这取决于主操作系统以及JVM实现。

直接缓冲区是通过调用ByteBuffer.allocateDirect()方法创建的,注意,用wrap()方法创建的缓冲区总是非直接的。

java nio 缓冲区(二)相关推荐

  1. java nio 缓冲区(一)

      本文来自于我的个人博客:java nio 缓冲区(一) 我们以Buffer类開始对java.nio包的浏览历程.这些类是java.nio的构造基础. 这个系列中,我们将尾随<java NIO ...

  2. java如何设置缓冲区_缓冲区设置JAVA NIO 缓冲区

    时间紧张,先记一笔,后续优化与完善. buf.clear(); while (in.read(buf) >= 0 || buf.position != 0) { buf.flip(); out. ...

  3. JAVA NIO缓冲区(Buffer)------ByteBuffer常用方法详解

    缓冲区(Buffer) 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区: 使用缓冲区有这么两个好处: 1.减少实际 ...

  4. Java NIO(二)缓冲区Buffer

    本文以CharBuffer为例,运行下代码结合注释看,有一个要点是无论什么操作,capacity不会变. 1.Buffer基本属性 public void testProperties(){CharB ...

  5. 【java】关于Java NIO的一切

    1.概述 概述:关于Java NIO的『一切』 建议看原文 太长了 本文译自Jakob Jenkov的Java NIO.注意,并非逐字翻译,删除了原文中碎碎念的部分,有些地方也加入了自己的理解. Ja ...

  6. Java NIO SocketChannel+Buffer+Selector 详解(含多人聊天室实例)

    一.Java NIO 的核心组件 Java NIO的核心组件包括:Channel(通道),Buffer(缓冲区),Selector(选择器),其中Channel和Buffer比较好理解  简单来说 N ...

  7. Java NIO Selector详解(含多人聊天室实例)

    一.Java NIO 的核心组件 Java NIO的核心组件包括:Channel(通道),Buffer(缓冲区),Selector(选择器),其中Channel和Buffer比较好理解 简单来说 NI ...

  8. 四、Java NIO Selector

    一.Java NIO 概述 二.Java NIO Channel 三.Java NIO Buffer 四.Java NIO Selector 五.Java NIO 扩展 一.Selector 简介 1 ...

  9. Java NIO系列教程(十二) Java NIO与IO

    原文地址:http://tutorials.jenkov.com/java-nio/nio-vs-io.html 作者:Jakob Jenkov   译者:郭蕾    校对:方腾飞 当学习了Java ...

最新文章

  1. Light OJ 1012
  2. C# SignalR 即时通讯 聊天室
  3. 事务对性能影响_开启英特尔事务扩展技术(TSX),即可提升intel CPU 近40%性能
  4. 无法访问此网站localhost 拒绝了我们的连接请求_官方教程丨如何在IPFS上创建托管个人网站?...
  5. VTK:Render之RenderView
  6. android 模拟器 ddms,4 Android 模拟器 DDMS 和ADB.ppt
  7. HTTP服务器恢复文件头,浅谈“Web服务器解析漏洞”
  8. 一步步实现SDDC-嵌入式PSC的VC部署
  9. C++ 使用引用捕获异常
  10. DOS7.1安装与学习
  11. GPS接收天线 GPS天线原理(有源天线供电通常由接收机前端通过RF同轴电缆供电。)实际测试GPS接收芯片的SMA天线底座中心孔和底座之间电压3.3V,可以通过SMA接口对天线供电2022.3.30
  12. 用Excel做时间顺序的行为流程图
  13. python与爬虫-02复杂的HTML解析
  14. 【MyEclipse】配置代码格式化模版
  15. 安卓全屏java模拟器如何安装_使用Android 模拟器运行自定义Rom
  16. [Swift]LeetCode1108. IP 地址无效化 | Defanging an IP Address
  17. 分享WIN7输入法图标不显示的几种解决方法
  18. java回顾:JDBC、工具类、事务、SQL注入
  19. qrc路径_QT下添加*.qrc(图标Icon、图像)资源
  20. 由MessageBox透视Win32 API的调用

热门文章

  1. android 寺库trytry_美图与寺库达成战略合作 美图美妆将由 TryTry 运营
  2. 中小学计算机教室设备维修记录,校园网与教室多媒体设备维修管理暂行办法
  3. 小飞升值记——(21)
  4. web前端 - Vue常见问题汇总及解决方案
  5. MySQL查询最大值(最小值)或前n个最大(最小)值的方法分析
  6. Docker Swarm 健康检查
  7. 使用OpenVINO运行PPTracking下FairMOT多目标跟踪模型
  8. 太经典了!NBA球员超逗的豪言壮语
  9. 安装Tomcat服务器
  10. java期末考试复习题_JAVA期末考试复习试题