Java 网络编程之NIO(ByteBuffer)

    

在 Java NIO 中,ByteBuffer 是用于存储和传输数据的一种数据结构。它提供了高效的数据存储和读取能力,使得 Java NIO 能够高效地处理大量的数据输入输出。

ByteBuffer 的作用包括以下几个方面:

  1. 存储数据:ByteBuffer 可以存储任意长度的数据,可以根据需要动态地分配内存空间。通过 wrap() 方法可以将 ByteBuffer 包装成一个 Java ByteBuffer 对象,使得它可以被序列化和反序列化。

  2. 读取数据:ByteBuffer 提供了 read() 方法来读取数据,可以读取任意长度的数据,并且可以异步读取。read() 方法返回实际读取的数据长度,如果读取失败,则返回 -1。

  3. 写入数据:ByteBuffer 提供了 put() 方法来写入数据,可以异步写入数据。put() 方法将数据写入到 ByteBuffer 中,并将其标记为已填充。在写入数据后,可以使用 flush() 方法将数据写入到目的地。

  4. 连接数据:ByteBuffer 提供了连接数据的功能。通过连接数据,可以将多个数据包组合成一个数据包进行传输。连接数据可以提高数据传输的效率,减少数据传输的延迟。

总之,ByteBuffer 是 Java NIO 中的核心数据结构,它提供了高效的数据存储和读取能力,使得 Java NIO 能够高效地处理大量的数据输入输出。

创建ByteBuffer

 @Test
    public void createByteBuffer(){
        ByteBuffer buffer = ByteBuffer.allocate(10);//分配堆内存 10字节 受到GC的影响 读写速度较慢
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(10);//分配直接内存 读写速度快 但是要分配内存的事件慢
    }

 写数据

  buffer.put(new byte[]{97,98,99});
  buffer.put((byte) 'd');
  //channel.read(buffer);

 

 读数据

buffer.flip();//切换读模式
channel.write()//读数据

  

 byte b = buffer.get();
 System.out.println((char)b);
 b = buffer.get();
 System.out.println((char)b);

buffer.compact();

 buffer.clear();
 System.out.println(buffer.limit());//10

 

buffer.rewind()//  重新读
    mark()与 reset()方法
通过调用 Buffer.mark()方法,可以标记 Buffer 中的一个特定 position。之后可以通
过调用 Buffer.reset()方法恢复到这个 position

   ByteBuffer 与字符串的转换

 /*
      字符串与数组的转换
     */
    @Test
    public void test(){
        //String ------->ByteBuffer
        //使用String.getBytes()方法
        ByteBuffer buffer1 = ByteBuffer.allocateDirect(10);
        buffer1.put("hello".getBytes());
        //使用charset  自动变成读模式也就是position = 0
        ByteBuffer buffer2 = StandardCharsets.UTF_8.encode("hello");

        //使用ByteBuffer.warp()方法 自动变成读模式
        ByteBuffer buffer3 = ByteBuffer.wrap("hello".getBytes());

        //ByteBuffer ---->String
        String str2 = StandardCharsets.UTF_8.decode(buffer2).toString();
        System.out.println(str2);

    }

Scattering Reader

对于已知的数据长度用此方法可以避免字符串的截取

之前的文件内容

 

Gathering  Writer

 减少数据的拷贝与读取的次数

应用 (黏包,半包)

在网络传输过程中。我们可能收到下面的情况。

比如:发送的是hello\n

                        I am zhangsan\n

                        How  are you\n

三个包

但是我们收到的是hello\nI am zhangsan\nHow 

                             are you\n

两个包

    @Test
    public void test11() {
        ByteBuffer source = ByteBuffer.allocate(32);
        source.put("hello\nI am zhangsan\nHow ".getBytes());
        split(source);
        source.put("are you\n".getBytes());
        split(source);
    }

    public void split(ByteBuffer source){
        source.flip();
        for (int i = 0; i < source.limit(); i++) {
            int len = i + 1 - source.position();
            if ((char)source.get(i) == '\n'){
                byte[] data = new byte[32];
                source.get(data,source.position(),len);
                for (int j = 0;j<data.length;j++){
                    System.out.print((char)data[j]);
                }
            }
        }
        source.compact();
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch 8.X 如何基于用户指定 ID 顺序召回数据?

1、实战问题如何根据输入的id 的顺序输出结果&#xff0c;id 个数有500个&#xff0c;还有分页&#xff1f;问题来源&#xff1a;https://t.zsxq.com/0cdyq7tzr2、方案探讨2.1 Elasticsearch 默认排序机制在 Elasticsearch 中&#xff0c;如果未指定排序规则&#xff0c;检索结…

Linux下实现的 HTTP 服务器

项目功能&#xff1a;&#xff08;1&#xff09;能接收客户端的GET请求&#xff1b;&#xff08;2&#xff09;能够解析客户端的请求报文&#xff0c;根据客户端要求找到相应的资源&#xff1b;&#xff08;2&#xff09;能够回复http应答报文&#xff1b;&#xff08;3&#x…

数据结构和算法学习记录——设计循环队列(数组实现循环队列)核心思路、题解过程、完整题解

目录 题目描述 题目示例 核心思路 链表实现 数组实现 重点 题解过程 结构体类型定义 创建一个循环队列并初始化 判断循环队列为空或为满 入队列函数 出队列函数 取队头数据 取队尾数据 销毁循环队列 完整题解 题目来源&#xff1a;力扣 题目描述 设计你的…

Sentinel滑动时间窗限流算法原理及源码解析(下)

文章目录对统计数据如何使用获取之前统计好的数据对统计数据如何使用 流控快速失败 获取之前统计好的数据

SpringBoot 项目的创建与启动

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

iosApplePay

1、Apple Pay 接入工程 - 简书 // 设置币种、国家码及merchant标识符等基本信息 PKPaymentRequest *payRequest [[PKPaymentRequest alloc]init]; payRequest.countryCode "CN"; //国家代码 payRequest.currencyCode "CNY"; //RMB的币种代码 …

“被裁员之前,没得到任何风声,措手不及...” 一个在职6年测试工程师内心独白

前言 一个码农&#xff08;软件测试工程师&#xff09;的自白 小张&#xff1a; 我们用工作五年的积蓄&#xff0c;在这个一线城市买了房子&#xff0c;买了车子&#xff0c;然后领证。我也在6年前进入了一个很多人梦寐以求新的公司 码农的新生活开始了。在这家公司里&…

ChatGPT如何为企业提供帮助?

数字化转型是指利用技术来改变企业的运营方式并为客户提供价值&#xff0c;这不仅仅是关于如何采用新的技术或工具。要想取得成功&#xff0c;就需要从根本上改变文化和心态。 ChatGPT如何为企业提供帮助?从数据分析到知识管理再到客户服务等等&#xff0c;人工智能聊天机器人…

光伏发电系统模拟及其发电预测开源python工具pvlib

1. 太阳辐照量模拟 pysolar是一个用于计算太阳位置和辐照量的Python库。它是基于python语言编写的&#xff0c;可以方便地在各种python项目中使用。pysolar主要用于计算太阳的位置、太阳高度角、太阳方位角、日出和日落时间等信息。这些信息可以用于太阳能电池板和太阳能集热器…

【设计模式】创建型-抽象工厂模式

文章目录一、抽象工厂模式1.1、产品族、产品等级1.2、抽象工厂模式中的角色1.3、实例一、抽象工厂模式 在工厂方法模式中&#xff0c;每一个具体的工厂子类只能生成一种具体的产品&#xff0c;如果想要生产另外一种产品&#xff0c;就需要重新定义一个抽象工厂类&#xff0c;这…

泡泡玛特“失速”,盲盒经济迎来拐点?

配图来自Canva可画​ 前些年泡泡玛特的飞速增长&#xff0c;曾经在行业内外引起了广泛的反响&#xff0c;其主打的盲盒经济也曾风靡一时、被众多行业效仿。不过&#xff0c;这种情况在疫情肆虐的2022年似乎受到了一些影响&#xff0c;这在其财报中就有所体现。 3月29日&#…

Python 小型项目大全 61~65

六十一、ROT13 密码 原文&#xff1a;http://inventwithpython.com/bigbookpython/project61.html ROT13 密码是最简单的加密算法之一&#xff0c;代表“旋转 13 个空格”密码将字母A到Z表示为数字 0 到 25&#xff0c;加密后的字母距离明文字母 13 个空格&#xff1a; A变成N&…

【Android】之【自定义View实践】

这里以一个进度条的加载为例子&#xff0c;先看效果&#xff08;运行效果是动态变化的&#xff09; 一、自定义属性 首先在res->values目录下新建attrs资源文件&#xff0c;如下图&#xff1a; 内容如下&#xff1a; <?xml version"1.0" encoding"utf…

SpringBoot基础学习之(九)添加员工的信息

本次项目所有能够使用的静态资源可以免费进行下载 静态资源 在本篇代码DAO层将通过Java文件去实现&#xff0c;在这里就不连接数据&#xff0c;然后通过jdbc将数据库内容的内容显示出来 案例&#xff1a;员工管理系统 上一篇博文的主要的内容是展示员工的信息&#xff0c;本篇…

Oracle JDK 和 OpenJDK 有什么区别?

可能在看这个问题之前很多人和我一样并没有接触和使用过 OpenJDK 。那么 Oracle JDK 和 OpenJDK 之间是否存在重大差异&#xff1f;下面我通过收集到的一些资料&#xff0c;为你解答这个被很多人忽视的问题。 首先&#xff0c;2006 年 SUN 公司将 Java 开源&#xff0c;也就有…

JAVA——网络编程基本概念

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

腾讯云轻量服务器和云服务器区别对比(超详细)

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器费用更低&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

orcad library builder 建库及报错问题

目录 一.安装orcad library builder 二.orcad library builder 使用 1.建立一个orcad 原理图库测试下 尝试理解tcl那段的意思 xml文件导入建orcad库 折腾了2个多小时&#xff0c;居然没有直接方案搞定&#xff0c;简单记录下&#xff0c;后面遇到该问题的兄弟可参考借鉴&am…

Java集合框架之collection

1. 什么是集合 1.1 概念 对象的容器&#xff0c;实现类对对象常用的操作。 1.2 和数组的区别 数组长度固定&#xff0c;集合长度不固定。数组可以存储基本类型和引用类型&#xff0c;集合只能存储引用类型。 1.3 位置 java.util.*; 2. Collection体系 2.1 Collection父接…

网络编程 1

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 网络编程 什么是网络编程&#xff1f;…