【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(一)

简介: 【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(一)

I . 缓冲区 ( Buffer ) 存取类型


1 . 缓冲区 ( Buffer ) 数据读写类型 注意点 : 以 字节缓冲区 ( ByteBuffer ) 为例 ;



① 向 字节缓冲区 ( ByteBuffer ) 中放入数据 :


放入 Int 类型数据 : ByteBuffer putInt(int value) ;

放入 Double 类型数据 : ByteBuffer putDouble(double value) ;

放入 Short 类型数据 : ByteBuffer putShort(short value) ;

② 从 字节缓冲区 ( ByteBuffer ) 中读取数据 :


取出 Int 类型数据 : int getInt() ;

取出 Double 类型数据 : double getDouble() ;

取出 Short 类型数据 : short getShort() ;

③ 读取数据注意点 : 读取 字节缓冲区 ( ByteBuffer ) 数据时 , 必须按照放入 字节缓冲区 ( ByteBuffer ) 中的数据进行 , 否则就会读出错误数据 , 或乱码 ;


④ 读取溢出 : 读取 或 写出时 , position 一定不能超过 limit , 否则就会报 BufferUnderFlowException 异常 ;


Exception in thread "main" java.nio.BufferUnderflowException
  at java.nio.Buffer.nextGetIndex(Buffer.java:506)
  at java.nio.HeapByteBuffer.getInt(HeapByteBuffer.java:361)
  at kim.hsl.nio.BufferDemo2.main(BufferDemo2.java:23)


代码示例 :


package kim.hsl.nio;
import java.nio.ByteBuffer;
public class BufferDemo2 {
    public static void main(String[] args) {
        //1 . 创建一个存储 Int 类型数据的 Buffer , 可以存储 1024 个字节
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        //2 . 向缓冲区中放入数据
        buffer.putInt(8888);
        buffer.putDouble(88.888);
        buffer.putShort((short) 888);
        //3 . 写入转读取前先翻转, 将 position 设置为 0
        buffer.flip();
        //4 . 从缓冲区中读取数据
        int intValue = buffer.getInt();
        double doubleValue = buffer.getDouble();
        short shortValue = buffer.getShort();
        //已经读取完了, 在读取就溢出了 java.nio.BufferUnderflowException
        //buffer.getInt();
        //5 . 打印读取的数据信息
        System.out.println(String.format("intValue = %d, doubleValue = %f, shortValue = %d", 
                intValue, doubleValue, shortValue));
    }
}


执行结果 :


intValue = 8888, doubleValue = 88.888000, shortValue = 888





II . 只读缓冲区 ( ReadOnlyBuffer )


1 . 只读 缓冲区 ( ReadOnlyBuffer ) :



① 只读缓冲区 ( ReadOnlyBuffer ) 获取 : 先创建一个 Buffer 对象 , 向其中存储数据 , 调用 asReadOnlyBuffer() 方法 , 可以返回一个只读缓冲区 , 该缓冲区 , 只能读取 , 不能写入 ;


② 实际类型 : 只读缓冲区的类型是 HeapByteBufferR ;


③ 只读缓冲区写入数据异常 : 该 只读缓冲区 ( ReadOnlyBuffer ) 只能读取数据 , 不能向其中写入数据 ; 如果写入数据 , 就会报异常 ;


Exception in thread "main" java.nio.ReadOnlyBufferException
  at java.nio.HeapByteBufferR.putShort(HeapByteBufferR.java:324)
  at kim.hsl.nio.BufferDemo3.main(BufferDemo3.java:28)



2 . 示例代码 :


package kim.hsl.nio;
import java.nio.ByteBuffer;
public class BufferDemo3 {
    public static void main(String[] args) {
        //1 . 创建一个存储 Int 类型数据的 Buffer , 可以存储 1024 个字节
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        //2 . 向缓冲区中放入数据
        buffer.putInt(8888);
        buffer.putDouble(88.888);
        buffer.putShort((short) 888);
        //3 . 写入转读取前先翻转, 将 position 设置为 0
        buffer.flip();
        //4 . 将上述缓冲区转为只读缓冲区
        ByteBuffer readOnlyBuffer = buffer.asReadOnlyBuffer();
        //5 . 从缓冲区中读取数据
        int intValue = readOnlyBuffer.getInt();
        double doubleValue = readOnlyBuffer.getDouble();
        short shortValue = readOnlyBuffer.getShort();
        //已经读取完了, 在读取就溢出了 java.nio.BufferUnderflowException
        //buffer.getInt();
        //向只读缓冲区中存放数据抛 java.nio.ReadOnlyBufferException 异常
        //readOnlyBuffer.putShort((short) 888);
        //5 . 打印读取的数据信息
        System.out.println(String.format("intValue = %d, doubleValue = %f, shortValue = %d",
                intValue, doubleValue, shortValue));
    }
}





执行结果 :


intValue = 8888, doubleValue = 88.888000, shortValue = 888



目录
相关文章
|
3月前
|
设计模式
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
Lettuce的特性和内部实现问题之Netty NIO的性能优于BIO的问题如何解决
|
18天前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
2月前
|
Java
Netty BIO/NIO/AIO介绍
Netty BIO/NIO/AIO介绍
|
3月前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
121 0
|
3月前
|
存储 网络协议 Java
【Netty 神奇之旅】Java NIO 基础全解析:从零开始玩转高效网络编程!
【8月更文挑战第24天】本文介绍了Java NIO,一种非阻塞I/O模型,极大提升了Java应用程序在网络通信中的性能。核心组件包括Buffer、Channel、Selector和SocketChannel。通过示例代码展示了如何使用Java NIO进行服务器与客户端通信。此外,还介绍了基于Java NIO的高性能网络框架Netty,以及如何用Netty构建TCP服务器和客户端。熟悉这些技术和概念对于开发高并发网络应用至关重要。
74 0
|
6月前
|
Java 应用服务中间件 API
从零手写实现 tomcat-06-servlet bio/thread/nio/netty 池化处理
该文介绍了逐步改进的网络服务器实现,从最初的 BIO 基础版到使用线程池的 BIO+Thread,再到 NIO 版本和 NIO+Thread,最后展示了一个使用 Netty 框架的简洁实现。文章旨在说明如何解决阻塞问题,并对比不同模型的优劣,最终推荐使用 Netty 以简化 NIO 编程。
|
6月前
|
编解码 网络协议 Java
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
|
6月前
|
移动开发 编解码 网络协议
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
|
存储 缓存 NoSQL
跟着源码学IM(十一):一套基于Netty的分布式高可用IM详细设计与实现(有源码)
本文将要分享的是如何从零实现一套基于Netty框架的分布式高可用IM系统,它将支持长连接网关管理、单聊、群聊、聊天记录查询、离线消息存储、消息推送、心跳、分布式唯一ID、红包、消息同步等功能,并且还支持集群部署。
13503 1
|
6月前
|
消息中间件 Oracle Dubbo
Netty 源码共读(一)如何阅读JDK下sun包的源码
Netty 源码共读(一)如何阅读JDK下sun包的源码
132 1