`
wx1569488408
  • 浏览: 79146 次
文章分类
社区版块
存档分类
最新评论

Netty进阶基础篇之NIO Buffer篇(3)

 
阅读更多

1、Buffer概念

1.1 缓冲区获取

Buffer缓冲区是就是一个数组,有着不同的数据类型:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer,然后这些数据类型都可以通过 allocate() 获取缓冲区。

static XxxBuffer allocate(int capacity) : 创建一个容量为 capacity 的 XxxBuffer 对象,如下:

//1. 分配一个指定大小的Byte类型的缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

1.2  缓冲区存取数据的两个核心方法

put() : 存入数据到缓冲区中

put(byte b) 将给定单个字节写入缓冲区的当前位置

put(byte[] src)

将 src 中的字节写入缓冲区的当前位置

put(int index, byte b)

将指定字节写入缓冲区的索引位置(不会移动 position)


get() : 获取缓冲区中的数据

get()

读取单个字节

get(byte[] dst)

批量读取多个字节到 dst 中

get(int index)

读取指定索引位置的字节(不会移动 position)

byteBuffer.put(“Mujiutian”);
byteBuffer.get();

1.3 缓冲区中的四个核心属性

0 <= mark <= position <= limit <= capacity

capacity : 容量,表示缓冲区中最大存储数据的容量。一旦声明不能改变。

byteBuffer.capacity()

limit : 界限,表示缓冲区中可以操作数据的大小。(limit 后数据不能进行读写)

byteBuffer.limit()

position : 位置,表示缓冲区中正在操作数据的位置。

byteBuffer.position()

mark : 标记,表示记录当前 position 的位置。可以通过 reset() 恢复到 mark 的位置

byteBuffer.mark()

f091f29ac36967ae126ae34a4ad5e320c13.jpg

1.4 Buffer常用的方法

b228870889bc503a40937a5153f2bb665c3.jpg

1.5、直接缓冲区与非直接缓冲区

非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中

c53c82b109e362ed40bcac6d5b29e80411b.jpg

直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率

1d934b5e5eae6630bbea0ad36191878ba33.jpg

2、代码讲解

2.1 使用缓冲区的各种方法

@Test
public void test1(){
   String str = "MuJiuTian";
   
   //1. 分配一个指定大小的Byte类型的缓冲区
   ByteBuffer buf = ByteBuffer.allocate(1024);
   
   System.out.println("-----------------allocate()----------------");
   //此时缓冲区为读,下标位置
   System.out.println(buf.position());
   //此时缓冲区的界线,也就是临界点,1024
   System.out.println(buf.limit());
   //缓冲区的容量
   System.out.println(buf.capacity());
   
   //2. 利用 put() 存入数据到缓冲区中
   buf.put(str.getBytes());
   
   System.out.println("-----------------put()----------------");
   //此时缓冲区为读,下标位置已经读到第五个了
   System.out.println(buf.position());
   System.out.println(buf.limit());
   System.out.println(buf.capacity());
   
   //3. 切换读取数据模式,切换为写的模式,也就是把刚刚读取的内容重新从下标0开始读
   buf.flip();
   
   System.out.println("-----------------flip()----------------");
   System.out.println(buf.position());
   System.out.println(buf.limit());
   System.out.println(buf.capacity());
   
   //4. 利用 get() 读取缓冲区中的数据
   byte[] dst = new byte[buf.limit()];
   buf.get(dst);
   System.out.println(new String(dst, 0, dst.length));
   
   System.out.println("-----------------get()----------------");
   System.out.println(buf.position());
   System.out.println(buf.limit());
   System.out.println(buf.capacity());
   
   //5. rewind() : 可重复读
   buf.rewind();
   
   System.out.println("-----------------rewind()----------------");
   System.out.println(buf.position());
   System.out.println(buf.limit());
   System.out.println(buf.capacity());
   
   //6. clear() : 清空缓冲区. 但是缓冲区中的数据依然存在,但是处于“被遗忘”状态
   buf.clear();
   
   System.out.println("-----------------clear()----------------");
   System.out.println(buf.position());
   System.out.println(buf.limit());
   System.out.println(buf.capacity());
   
   System.out.println((char)buf.get());
}

结果:

4e2cc08ae82a0baa8d417a9b96b2e4760a1.jpg

看刚刚的流程图:

71d7a7b23829239962dca1e463e0efd87f2.jpg

2.2 使用简单方法掌握buffer的基本方法

@Test
public void test2(){

   String str = "Mujiutian";

   //创建Byte类型缓冲区
   ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
   //此时为读模式,读取str内容
   byteBuffer.put(str.getBytes());
   //切换为写的模式,处理刚刚读取的内容
   byteBuffer.flip();

   //此时limit为9,因为读取了Mujiutian 9个字节
   byte[] dst = new byte[byteBuffer.limit()];
   //读取下标0到2的字节
   byteBuffer.get(dst, 0, 2);
   System.out.println(new String(dst, 0, 2));
   System.out.println(byteBuffer.position());
   
   //mark() : 标记
   byteBuffer.mark();

   byteBuffer.get(dst, 2, 2);
   System.out.println(new String(dst, 2, 2));
   System.out.println(byteBuffer.position());
   
   //reset() : 使用该方法,位置恢复到 mark 的位置
   byteBuffer.reset();
   System.out.println(byteBuffer.position());
   
   //判断缓冲区中是否还有剩余数据
   if(byteBuffer.hasRemaining()){
      //获取缓冲区中可以操作的数量
      System.out.println(byteBuffer.remaining());
   }
}

结果为:

ea73e224abb71b06bba3fcdcbf893930ad2.jpg

2.3 测试是否为缓冲区

@Test
public void test3(){
   //分配直接缓冲区
   ByteBuffer buf = ByteBuffer.allocateDirect(1024);
   System.out.println(buf.isDirect());
}

结果:true

转载于:https://my.oschina.net/mdxlcj/blog/3073857

分享到:
评论

相关推荐

    《Netty进阶之路 跟着案例学Netty》.rar

    Java进阶技术-netty进阶之路

    《Netty进阶之路 跟着案例学Netty》_李林锋_

    Netty进阶之路 跟着案例学Netty 整本书无密码,Netty进阶之路 跟着案例学Netty

    Netty进阶之路-跟着案例学Netty

    《Netty进阶之路-跟着案例学Netty》是由知名技术专家李林峰撰写的一本专为Java开发者深入理解Netty框架而准备的书籍。这本书旨在通过实例教学,帮助读者全面掌握Netty的核心特性和实战技巧,提升网络编程的能力。 ...

    Netty进阶之路:跟着案例学Netty 完整版.pdf

    《Netty进阶之路:跟着案例学Netty》中的案例涵盖了Netty的启动和停止、内存、并发多线程、性能、可靠性、安全等方面,囊括了Netty绝大多数常用的功能及容易让人犯错的地方。在案例的分析过程中,还穿插讲解了Netty...

    高清_书签_Netty进阶之路 跟着案例学Netty.zip

    Netty将Java NIO接口封装,提供了全异步编程方式,是各大Java项目的网络应用开发必备神器。本书作者是国内Netty技术的先行者和布道者,本书是他继《Netty权威指南》之后的又一力作。在本书中,作者将在过去几年实践...

    Netty进阶之路--跟着案例学part2

    在《Netty进阶之路:跟着案例学Netty》中,作者将在过去几年实践中遇到的问题,以及Netty学习者咨询的相关问题,进行了归纳和总结,以问题案例做牵引,通过对案例进行剖析,讲解问题背后的原理,并结合Netty源码分析...

    读书笔记:《Netty进阶之路跟着案例学Netty》.zip

    读书笔记:《Netty进阶之路跟着案例学Netty》

    《Netty进阶之路+跟着案例学Netty》_李林锋1

    《Netty进阶之路+跟着案例学Netty》是由李林锋著的一本关于Java网络编程框架Netty的专业书籍。Netty是一个基于Java NIO(非阻塞I/O)的高性能、异步事件驱动的网络应用程序框架,广泛应用于各类Java项目,尤其是需要...

    Netty进阶之路--跟着案例学part1

    在《Netty进阶之路:跟着案例学Netty》中,作者将在过去几年实践中遇到的问题,以及Netty学习者咨询的相关问题,进行了归纳和总结,以问题案例做牵引,通过对案例进行剖析,讲解问题背后的原理,并结合Netty源码分析...

    笔记,3、Netty进阶和实战2

    【Netty进阶和实战2】笔记主要涵盖了UDP协议、Netty框架中UDP的实现以及服务器推送技术。UDP,即用户数据报协议,是一种无连接的、不可靠的传输协议,适用于那些能处理或容忍数据丢失但需要快速传输的应用场景。在...

    笔记,3、Netty进阶和实战1

    【笔记,3、Netty进阶和实战1】 在IT领域,Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于开发高效的网络服务。本篇笔记将深入探讨Netty在UDP协议上的应用,包括单播和广播的实现,以及服务器推送技术...

    NIO netty开发

    netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty...

    NIO+Netty5视频教程与Netty源码剖析视频教程

    标签关键词"nio"、"netty教程"、"netty源码"、"netty5"和"nio"表明,本教程不仅关注于基础的NIO技术,更专注于Netty5这一特定版本,以及源码级别的理解和应用。通过学习这个教程,开发者不仅能提升网络编程能力,还...

    java_Netty权威指南,详解nio,tcp,http,netty

    这个权威指南深入探讨了Netty的核心概念和技术,同时也涵盖了与网络编程相关的基础,如非阻塞I/O(NIO)、传输控制协议(TCP)以及超文本传输协议(HTTP)。下面将对这些知识点进行详细解释。 一、非阻塞I/O(NIO)...

    netty案例.zip

    1. **Netty基础架构**: Netty采用了Reactor模式,它是一种处理并发I/O事件的设计模式,主要由Selector(选择器)、ServerBootstrap(引导类)和Channel(通道)等组件构成。在这个案例中,你会看到ServerBootstrap...

    【项目实战】Netty源码剖析&NIO;+Netty5各种RPC架构实战演练三部曲视频教程(未加密)

    ### Netty源码剖析与NIO及Netty5各种RPC架构实战演练三部曲知识点解析 #### 一、Netty概述 Netty是一款基于Java NIO的高性能服务器端编程框架,用于快速开发可维护的网络应用程序。它简化了网络编程的复杂性,使...

    基于netty的nio使用demo源码

    在Netty中,NIO被用来实现高效的网络通信。 NIO的核心概念包括通道(Channel)、缓冲区(Buffer)、选择器(Selector)和处理器(Handler)。Netty中的NIO系统主要由以下组件组成: 1. **通道(Channel)**:它是...

    从NIO到Netty,编程实战出租车905协议-08172347.pdf

    第3章,结合905.4-2014协议的基本内容,动手实现NIO长连接服务端的实现,以及协议内容的设计和实现思路; 第4章,实现长连接客户端,以及采用多线程技术进行系统性能测试; 第5章,介绍Netty相关基础知识,并使用...

    Netty网络编程视频教程

    NIO 基础 1. 三大组件 2. ByteBuffer 3. 文件编程 4. 网络编程 5. NIO vs BIO 二. Netty 入门 1. 概述 2. Hello World 3. 组件 4. 双向通信 三. Netty 进阶 1. 粘包与半包 2. 协议设计与解析 3. 聊天室案例 四. ...

Global site tag (gtag.js) - Google Analytics