字节数组相关知识

ByteBuffer 是 Java NIO(非阻塞输入输出)包中的一个类,用于在字节缓冲区中处理原始字节数据。它提供了一个方法来存储和操作字节数据,特别适用于需要在文件、网络操作或直接操作内存中处理二进制数据的场景。

主要特点

  • Direct和Non-direct缓冲区ByteBuffer 可以是直接缓冲区(直接与操作系统的内存交互,通常速度更快)或非直接缓冲区(在Java堆中分配)。用户可以通过 ByteBuffer.allocateDirect(int capacity) 方法创建直接缓冲区。
  • 多种数据类型的支持:除了基本的字节操作,ByteBuffer 还提供了处理其他数据类型的方法,如 putInt()putFloat()getDouble()等。
  • 位置、限制和容量ByteBuffer 具有三个重要的属性:位置(position)、限制(limit)和容量(capacity),通过这些属性可以控制读写的流动和状态。

基本方法

以下是一些常用的 ByteBuffer 方法:

  1. allocate(int capacity):创建一个指定容量的非直接缓冲区。

    ByteBuffer buffer = ByteBuffer.allocate(10);
    
  2. allocateDirect(int capacity):创建一个指定容量的直接缓冲区。

    ByteBuffer directBuffer = ByteBuffer.allocateDirect(10);
    
  3. put(byte b):在当前位置插入一个字节。

    buffer.put((byte) 1);
    
  4. putInt(int value):在当前位置插入一个整型值。

    buffer.putInt(42);
    
  5. get():读取当前位置的字节,并将位置向后移动一位。

    byte b = buffer.get();
    
  6. getInt():读取当前位置的整型值,并将位置向后移动四位。

    int value = buffer.getInt();
    
  7. wrap(byte[] array):将一个字节数组包装为 ByteBuffer,使其可以直接操作该数组的内容。

    ByteBuffer buffer = ByteBuffer.wrap(new byte[10]);
    
  8. array():返回当前缓冲区的基础数组,可以直接操作。

    byte[] byteArray = buffer.array();
    

总结

ByteBuffer 是处理原始字节数据的强大工具,提供了多种方法以支持各种数据类型的存取,为 Java 程序在高性能 I/O 操作中提供了灵活性和简便性。

Direct(直接)缓冲区和 Non-direct(非直接)缓冲区在 Java NIO 中有以下主要区别:

1. 内存分配

  • 直接缓冲区(Direct ByteBuffer)

    • 直接缓冲区在 Java 堆外内存中分配。这意味着它的内存并不在 Java 的垃圾回收(GC)管理范围内。
    • 由于直接缓冲区与操作系统的内存直接交互,通常在进行 I/O 操作时可以减少复制开销,提高性能。
  • 非直接缓冲区(Non-direct ByteBuffer)

    • 非直接缓冲区在 Java 堆内存中分配。它存活于 Java 的垃圾回收机制之下。
    • 由于需要进行额外的内存复制操作(例如,从内核缓冲区到 Java 堆的复制),在进行 I/O 操作时,性能可能相对较低。

2. 性能

  • 直接缓冲区

    • 因为减少了对 Java 堆和直接内存之间的复制,直接缓冲区在高性能 I/O 操作,比如文件和网络通信时,通常具有更好的性能表现。
  • 非直接缓冲区

    • 由于需要额外的复制步骤,性能相对较低,特别是当进行大量数据传输时。

3. 生命周期管理

  • 直接缓冲区

    • 直接缓冲区的内存管理不受 Java 垃圾回收机制的控制,需通过 ByteBuffer.allocateDirect() 创建,直到 JVM 关闭前不能保证释放。
  • 非直接缓冲区

    • 非直接缓冲区的内存由 Java 垃圾回收管理,创建后可以直接通过 ByteBuffer.allocate() 创建,使用完毕后可以被自动回收。

4. 使用场景

  • 直接缓冲区

    • 适合于高性能需求、需要频繁进行 I/O 操作的场景,如大文件操作、网络数据传输等。
  • 非直接缓冲区

    • 适合于相对小的、偶发的 I/O 操作或者普通的应用程序日常内存使用。

总结

选择直接缓冲区或非直接缓冲区主要取决于应用的性能需求和内存管理策略。在需要高效的 I/O 操作时,直接缓冲区是更好的选择;而在其他常规内存操作时,非直接缓冲区可能更为简单和方便。

大小端(Endianess)是计算机系统中存储数据时的字节序列定义。它主要有两种类型:大端(Big Endian)和小端(Little Endian)。

以下是它们的定义和图示说明:

大端(Big Endian)

在大端模式中,数据的高位字节存储在低地址,低位字节存储在高地址。这意味着在内存中,数据的顺序是从左到右,按照从最重要的字节到最不重要的字节排列。

示例: 假设我们有一个整数 0x12345678(十六进制表示),它在内存中的存储方式如下:

地址:   0x00   0x01   0x02   0x03
内容:   0x12   0x34   0x56   0x78   (大端)

小端(Little Endian)

在小端模式中,数据的低位字节存储在低地址,高位字节存储在高地址。这意味着在内存中,数据的顺序是从右到左,按照从最不重要的字节到最重要的字节排列。

示例: 同样以整数 0x12345678 为例,它在内存中的存储方式如下:

地址:   0x00   0x01   0x02   0x03
内容:   0x78   0x56   0x34   0x12   (小端)

视觉图示

以下是用图示表现大小端存储的一个简单示例:

大端(Big Endian):
+-------+-------+-------+-------+
| 0x12  | 0x34  | 0x56  | 0x78  |
+-------+-------+-------+-------+
地址:    0x00    0x01    0x02    0x03小端(Little Endian):
+-------+-------+-------+-------+
| 0x78  | 0x56  | 0x34  | 0x12  |
+-------+-------+-------+-------+
地址:    0x00    0x01    0x02    0x03

总结

  • 大端(Big Endian):高位字节在前,低位字节在后,适合人类阅读顺序。
  • 小端(Little Endian):低位字节在前,高位字节在后,适合一些特定计算机架构。

每种字节序都有其特定的使用场景,网络协议往往使用大端,而某些处理器(如 x86 架构)则倾向于使用小端。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/427605.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软硬件项目运维方案(Doc原件完整版套用)

1 系统的服务内容 1.1 服务目标 1.2 信息资产统计服务 1.3 网络、安全系统运维服务 1.4 主机、存储系统运维服务 1.5 数据库系统运维服务 1.6 中间件运维服务 2 运维服务流程 3 服务管理制度规范 3.1 服务时间 3.2 行为规范 3.3 现场服务支持规范 3.4 问题记录规范…

【数据结构】排序算法---基数排序

文章目录 1. 定义2. 算法步骤2.1 MSD基数排序2.2 LSD基数排序 3. LSD 基数排序动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaCGo 结语 ⚠本节要介绍的不是计数排序 1. 定义 基数排序(英语:Radix sort)是一种非比较型的排序算法&…

秋招常问的面试题:Cookie和Session的区别

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

LeetCode[中等] 3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 思路:滑动窗口,设置左右指针left与right,maxLength存储长度 利用HashSet性质,存储滑动窗口中的字符 如果没有重复的,那么right继续向…

LeetCode_sql_day28(1767.寻找没有被执行的任务对)

描述:1767.寻找没有被执行的任务对 表:Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…

无人机企业合法运营必备运营合格证详解

无人机企业运营合格证,是由国家相关航空管理部门(如中国民用航空局或其授权机构)颁发的,用于确认无人机企业具备合法、安全、高效运营无人机能力的资质证书。该证书是无人机企业开展商业运营活动的必要条件,标志着企业…

原生+jquery写自动消失的提示框

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>自动消失消息提示</title> <style>/…

信息安全数学基础(9)素数的算数基本定理

前言 在信息安全数学基础中&#xff0c;素数的算数基本定理&#xff08;也称为唯一分解定理或算术基本定理&#xff09;是一个极其重要的定理&#xff0c;它描述了正整数如何唯一地分解为素数的乘积。这个定理不仅是数论的基础&#xff0c;也是许多密码学算法&#xff08;如RSA…

同为TVT设备主动注册协议接入SVMSPro平台

同为设备主动注册协议接入SVMSPro平台 步骤一&#xff1a;进设备网页或者NVR配置界面&#xff0c;进功能面板&#xff0c;网络&#xff0c;平台接入 接入类型&#xff1a;平台软件&#xff0c;勾选启用主动上报 服务器地址&#xff1a;平台服务IP 端口&#xff1a;12009 ID&…

高级算法设计与分析 学习笔记6 B树

B树定义 一个块里面存了1000个数和1001个指针&#xff0c;指针指向的那个块里面的数据大小介于指针旁边的两个数之间 标准定义&#xff1a; B树上的操作 查找B树 创建B树 分割节点 都是选择正中间的那个&#xff0c;以免一直分裂。 插入数字 在插入的路上就会检查节点需不需要…

RabbitMQ 高级特性——持久化

文章目录 前言持久化交换机持久化队列持久化消息持久化 前言 前面我们学习了 RabbitMQ 的高级特性——消息确认&#xff0c;消息确认可以保证消息传输过程的稳定性&#xff0c;但是在保证了消息传输过程的稳定性之后&#xff0c;还存在着其他的问题&#xff0c;我们都知道消息…

Delphi5利用DLL实现窗体的重用

文章目录 效果图参考利用DLL实现窗体的重用步骤1 设计出理想窗体步骤2 编写一个用户输出的函数或过程&#xff0c;在其中对窗体进行创建使它实例化步骤3 对工程文件进行相应的修改以适应DLL格式的需要步骤4 编译工程文件生成DLL文件步骤5 在需要该窗体的其他应用程序中重用该窗…

不会JS逆向也能高效结合Scrapy与Selenium实现爬虫抓取

1. 创建基础的scrapy项目 1.1 基础项目 在pycharm中安装scrapy框架 pip install scrapy 创建项目 scrapy startproject 项目名称 我们现在可以看到整体文件的目录&#xff1a; firstBlood ├── firstBlood # 项目跟目录 │ ├── init.py │ ├── items.py # 封装数…

【网络】高级IO——select版本TCP服务器

目录 前言 一&#xff0c;select函数 1.1.参数一&#xff1a;nfds 1.2.参数二&#xff1a; readfds, writefds, exceptfds 1.2.1.fd_set类型和相关操作宏 1.2.2.readfds, writefds, exceptfds 1.2.3.怎么理解 readfds, writefds, exceptfds是输入输出型参数 1.3.参数三…

数据结构之二叉树遍历

二叉树的遍历 先序遍历 先输入父节点&#xff0c;再遍历左子树和右子树&#xff1a;A、B、D、E、C、F、G 中序遍历 先遍历左子树&#xff0c;再输出父节点&#xff0c;再遍历右子树&#xff1a;D、B、E、A、F、C、G 后序遍历 先遍历左子树&#xff0c;再遍历右子树&#xff0c;…

SpringBoot设置mysql的ssl连接

因工作需要&#xff0c;mysql连接需要开启ssl认证&#xff0c;本文主要讲述客户端如何配置ssl连接。 开发环境信息&#xff1a; SpringBoot&#xff1a; 2.0.5.RELEASE mysql-connector-java&#xff1a; 8.0.18 mysql version&#xff1a;8.0.18 一、检查服务端是否开启ssl认…

微信公众号开发入门

微信公众号开发是指开发者基于微信公众平台&#xff08;WeChat Official Accounts Platform&#xff09;所提供的接口与功能&#xff0c;开发和构建自定义的功能与服务&#xff0c;以满足企业、组织或个人在微信生态中的应用需求。微信公众号开发主要围绕公众号消息处理、菜单管…

K1计划100%收购 MariaDB; TDSQL成为腾讯云核心战略产品; Oracle@AWS/Google/Azure发布

重要更新 1. 腾讯全球数字生态大会与9月5日-6日举行&#xff0c;发布“5T”战略&#xff0c;包括TDSQL、TencentOS、TCE&#xff08;专有云 &#xff09;、TBDS&#xff08;大数据&#xff09;、TI &#xff08;人工智能开发平台&#xff09;等 ( [2] ) ; 并正式向原子开源基金…

初始分布式系统和Redis特点(

&#xff08;一&#xff09;认识redis Redis是一个开源&#xff08;BSD许可&#xff09;&#xff0c;内存存储的数据结构服务器&#xff0c;可用作数据库&#xff0c;高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合&#xff0c;位图&#xff0c;hyperlog…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0920)

十三、文章分类页面 - [element-plus 表格] Git仓库&#xff1a;https://gitee.com/msyycn/vue3-hei-ma.git 基本架子 - PageContainer 功能需求说明&#xff1a; 基本架子-PageContainer封装文章分类渲染 & loading处理文章分类添加编辑[element-plus弹层]文章分类删除…