搜索
写经验 领红包

etty缓冲区(io缓冲区放在jvm哪里)

在生活中,很多人可能想了解和弄清楚Java,NIO的ByteBuffer,Netty缓冲区ByteBuf及内部结构设计的相关问题?那么关于netty 缓冲区的答案我来给大家详细解答下。

netty 缓冲区(nio缓冲区放在jvm哪里)

说明

网络数传数据的基本单位是字节,Java NIO提供了ByteBuffer作为它的字节容器,而Netty的实现了ByteBuf是一个强大的实现。

Java NIO ByteBuffer

ByteBuffer内部持有一个byte[], 另加:mark、position、limit、capacity四个属性:

mark,用来标记当前位置,以便可用回退到该位置,默认为undefind;

position,当前可用操作的位置,调用get()方法,返回:bt[postion]处的值,如果是调用put方法,将数据放入bt[position]的位置;

limit,可读或可写的最大索引;

capacity,最大容量,ByteBuffer对象一旦创建,不能修改capacity属性;

Netty ByteBuf

ByteBuf维护两个不同的索引,一个是读索引(readerIndex),一个是写索引(writerIndex)。

当从ByteBuf中读取数据的时候readerIndex索引会递增已经被读取的字节数;当写入ByteBuf的时候,writerIndex索引会被递增。

Java NIO ByteBuffer案例

import java.nio.ByteBuffer;import java.nio.charset.Charset;public class ByteBufferDemo {    public static void main(String[] args) {        // ==================================================================//        // === 创建和分配        // HeapByteBuffer-->        ByteBuffer heapByteBuffer = ByteBuffer.allocate(10);        System.out.println(&34; + Runtime.getRuntime().freeMemory());        // DirectByteBuffer-->直接缓冲区        ByteBuffer directByteBuffer = ByteBuffer.allocateDirect(10);        System.out.println(&34; + Runtime.getRuntime().freeMemory());        // 直接缓冲区是I/O的最佳选择,创建起来可能会比非直接字节缓冲区昂贵;        // 直接缓冲区使用的内存是通过绕过标准JVM堆调用本地特定于操作系统的代码来分配的;        byte[] bytes = new byte[64];        ByteBuffer bytesBB = ByteBuffer.wrap(bytes);        ByteBuffer bytesBB2 = ByteBuffer.wrap(bytes, 10, 10);        // 冲区都有4个属性:mark<标记>、position<位置>、limit<限制>、capacity<容量>        // 遵循:mark <= position <= limit <= capacity        printByteBuffer(bytesBB);        printByteBuffer(bytesBB2);        // ==================================================================//        // === 转换        transfor();    }    private static void transfor() {        // 字符串===>byte[]===>ByteBuffer        String string = &34;;        byte[] stringBytes = string.getBytes(Charset.forName(&34;));        ByteBuffer stringByteBuffer = ByteBuffer.wrap(stringBytes);        System.out.println(stringByteBuffer);        stringByteBuffer.clear();        System.out.println(stringByteBuffer);        // ByteBuffer===>byte[]===>字符串        byte[] transforBytes = new byte[stringByteBuffer.remaining()];        stringByteBuffer.get(transforBytes);        System.out.println(new String(transforBytes, Charset.forName(&34;)));        System.out.println(stringByteBuffer);        // ByteBuffer===>byte[]===>字符串        // clear(): position = 0;limit = capacity;mark = -1; 不影响底层byte数组的内容        printByteBuffer(stringByteBuffer);        stringByteBuffer.clear();        printByteBuffer(stringByteBuffer);        byte[] transforBytes2 = new byte[stringByteBuffer.remaining()];        stringByteBuffer.get(transforBytes2, 0, transforBytes2.length);        System.out.println(new String(transforBytes2, Charset.forName(&34;)));        printByteBuffer(stringByteBuffer);    }    private static void printByteBuffer(ByteBuffer byteBuffer) {        System.out.println(&34;);        System.out.println(&34; + byteBuffer.mark());        System.out.println(&34; + byteBuffer.position());        System.out.println(&34; + byteBuffer.limit());        System.out.println(&34; + byteBuffer.capacity());        System.out.println(&34;);    }}

Netty ByteBuf案例

import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty.util.CharsetUtil;import java.nio.charset.Charset;public class ByteBufDemo {    public static void main(String[] args) {        // ==================================================================//        // === 堆缓冲区,创建和分配        ByteBuf byteBuf1 = Unpooled.buffer(10);        // 写入内容int类型        for (int i = 0; i < 6; i++) {            byteBuf1.writeByte(i);        }        // 打印内容        printByteBuf(byteBuf1);        // 读出内容        for (int i = 0; i < 3; i++) {            System.out.println(byteBuf1.readByte());        }        printByteBuf(byteBuf1);        // 直接缓冲区        ByteBuf byteBuf = Unpooled.directBuffer();        // ==================================================================//        // === 转换        transfor();    }    private static void transfor() {        // 字符串===>byte[]===>ByteBuf        String string = &34;;        byte[] stringBytes = string.getBytes(Charset.forName(&34;));        ByteBuf byteBuf = Unpooled.copiedBuffer(stringBytes);        printByteBuf(byteBuf);        // ByteBuf===>byte[]===>字符串        byte[] stringBytes2 = new byte[byteBuf.capacity()];        byteBuf.readBytes(stringBytes2);        System.out.println(&34; + new String(stringBytes2,Charset.forName(&34;)));        // ByteBuf===>byte[]===>字符串        byteBuf.resetReaderIndex();        string = byteBuf.toString(CharsetUtil.UTF_8);        System.out.println(&34; + string);    }    private static void printByteBuf(ByteBuf byteBuf) {        System.out.println(&34;);        System.out.println(&34; + byteBuf.writerIndex());        System.out.println(&34; + byteBuf.readerIndex());        System.out.println(&34; + byteBuf.capacity());        System.out.println(&34;);    }}

温馨提示:通过以上关于Java,NIO的ByteBuffer,Netty缓冲区ByteBuf及内部结构设计内容介绍后,相信大家有新的了解,更希望可以对你有所帮助。