> 电脑数码
etty缓冲区(io缓冲区放在jvm哪里)
在生活中,很多人可能想了解和弄清楚Java,NIO的ByteBuffer,Netty缓冲区ByteBuf及内部结构设计的相关问题?那么关于netty 缓冲区的答案我来给大家详细解答下。
说明
网络数传数据的基本单位是字节,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及内部结构设计内容介绍后,相信大家有新的了解,更希望可以对你有所帮助。