【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



目录
相关文章
|
存储 编解码 移动开发
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
204 1
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
221 2
|
Java API 索引
Netty Review - ByteBuf 读写索引 详解
Netty Review - ByteBuf 读写索引 详解
364 1
|
Java 索引
📌 Java NIO Buffer
Java NIO缓冲区在与NIO通道交互时使用。数据从通道读取到缓冲区,然后从缓冲区写入通道。 缓冲区本质上是一块内存,可以在其中写入数据,然后再进行读取。这个内存块被封装在一个NIOBuffer对象中,该对象提供了一组方法,可以更容易地使用内存块。
|
编解码 网络协议
Netty基础篇:NIO中缓冲区设置太小
Netty基础篇:NIO中缓冲区设置太小
|
存储 网络协议 Java
NIO - 基础入门之通道和缓冲区
NIO - 基础入门之通道和缓冲区
337 0
|
存储 网络协议 Java
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
选择器,也叫多路复用器,Java的NIO通过selector实现一个线程处理多个客户端链接,多个channel可以注册到同一个Selector,Selector能够监测到channel上是否有读/写事件发生,从而获取事件和对事件进行处理,所以Selector切到哪个channel是由事件决定的。当线程从某个客户端通道未读取到数据时,可以把空闲时间用来做其他任务,性能得到了提升。
504 0
|
弹性计算 Java API
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
理解Selector 和 Channel Selector 选择器,也叫多路复用器,可以同时处理多个客户端连接,多路复用器采用轮询机制来选择有读写事件的客户端链接进行处理。 通过 Selector ,一个 I/O 线程可以并发处理 N 个客户端连接和读写操作,这解决了传统同步阻塞 I/O 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。 由于它的读写操作都是非阻塞的,这就可以充分提升 IO 线程的运行效率,避免由于频繁 I/O 阻塞导致的线程挂起。
496 0
|
前端开发
Netty4 读写水位控制分析
Netty4 读写水位控制分析
220 0
Java Nio (三):直接缓冲区 和 非直接缓冲区
Java Nio (三):直接缓冲区 和 非直接缓冲区
Java Nio (三):直接缓冲区 和 非直接缓冲区