ByteBufDemo
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.study.hc</groupId> <artifactId>chapter-2</artifactId> <version>1.0.0</version> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build> <packaging>jar</packaging> <name>hc-chapter-2</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.32.Final</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> </project>
package com.study.hc.net.netty.demo; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import org.junit.Test; import java.util.Arrays; /** * bytebuf的常规API操作示例 */ public class ByteBufDemo { @Test public void apiTest() { // +-------------------+------------------+------------------+ // | discardable bytes | readable bytes | writable bytes | // | | (CONTENT) | | // +-------------------+------------------+------------------+ // | | | | // 0 <= readerIndex <= writerIndex <= capacity // 1.创建一个非池化的ByteBuf,大小为10个字节 ByteBuf buf = Unpooled.buffer(10); System.out.println("原始ByteBuf为====================>" + buf.toString()); System.out.println("1.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 2.写入一段内容 byte[] bytes = {1, 2, 3, 4, 5}; buf.writeBytes(bytes); System.out.println("写入的bytes为====================>" + Arrays.toString(bytes)); System.out.println("写入一段内容后ByteBuf为===========>" + buf.toString()); System.out.println("2.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 3.读取一段内容 byte b1 = buf.readByte(); byte b2 = buf.readByte(); System.out.println("读取的bytes为====================>" + Arrays.toString(new byte[]{b1, b2})); System.out.println("读取一段内容后ByteBuf为===========>" + buf.toString()); System.out.println("3.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 4.将读取的内容丢弃 buf.discardReadBytes(); System.out.println("将读取的内容丢弃后ByteBuf为========>" + buf.toString()); System.out.println("4.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 5.清空读写指针 buf.clear(); System.out.println("将读写指针清空后ByteBuf为==========>" + buf.toString()); System.out.println("5.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 6.再次写入一段内容,比第一段内容少 byte[] bytes2 = {1, 2, 3}; buf.writeBytes(bytes2); System.out.println("写入的bytes为====================>" + Arrays.toString(bytes2)); System.out.println("写入一段内容后ByteBuf为===========>" + buf.toString()); System.out.println("6.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 7.将ByteBuf清零 buf.setZero(0, buf.capacity()); System.out.println("将内容清零后ByteBuf为==============>" + buf.toString()); System.out.println("7.ByteBuf中的内容为================>" + Arrays.toString(buf.array()) + "\n"); // 8.再次写入一段超过容量的内容 byte[] bytes3 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; buf.writeBytes(bytes3); System.out.println("写入的bytes为====================>" + Arrays.toString(bytes3)); System.out.println("写入一段内容后ByteBuf为===========>" + buf.toString()); System.out.println("8.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 随机访问索引 getByte // 顺序读 read* // 顺序写 write* // 清除已读内容 discardReadBytes // 清除缓冲区 clear // 搜索操作 // 标记和重置 // 完整代码示例:参考 // 搜索操作 读取指定位置 buf.getByte(1); // } }
package com.study.hc.net.netty.demo; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import org.junit.Test; import java.util.Arrays; /** * 堆外内存的常规API操作示例 */ public class DirectByteBufDemo { @Test public void apiTest() { // +-------------------+------------------+------------------+ // | discardable bytes | readable bytes | writable bytes | // | | (CONTENT) | | // +-------------------+------------------+------------------+ // | | | | // 0 <= readerIndex <= writerIndex <= capacity // 1.创建一个非池化的ByteBuf,大小为10个字节 ByteBuf buf = Unpooled.directBuffer(10); System.out.println("原始ByteBuf为====================>" + buf.toString()); // System.out.println("1.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 2.写入一段内容 byte[] bytes = {1, 2, 3, 4, 5}; buf.writeBytes(bytes); System.out.println("写入的bytes为====================>" + Arrays.toString(bytes)); System.out.println("写入一段内容后ByteBuf为===========>" + buf.toString()); //System.out.println("2.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 3.读取一段内容 byte b1 = buf.readByte(); byte b2 = buf.readByte(); System.out.println("读取的bytes为====================>" + Arrays.toString(new byte[]{b1, b2})); System.out.println("读取一段内容后ByteBuf为===========>" + buf.toString()); //System.out.println("3.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 4.将读取的内容丢弃 buf.discardReadBytes(); System.out.println("将读取的内容丢弃后ByteBuf为========>" + buf.toString()); //System.out.println("4.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 5.清空读写指针 buf.clear(); System.out.println("将读写指针清空后ByteBuf为==========>" + buf.toString()); //System.out.println("5.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 6.再次写入一段内容,比第一段内容少 byte[] bytes2 = {1, 2, 3}; buf.writeBytes(bytes2); System.out.println("写入的bytes为====================>" + Arrays.toString(bytes2)); System.out.println("写入一段内容后ByteBuf为===========>" + buf.toString()); // System.out.println("6.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 7.将ByteBuf清零 buf.setZero(0, buf.capacity()); System.out.println("将内容清零后ByteBuf为==============>" + buf.toString()); // System.out.println("7.ByteBuf中的内容为================>" + Arrays.toString(buf.array()) + "\n"); // 8.再次写入一段超过容量的内容 byte[] bytes3 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; buf.writeBytes(bytes3); System.out.println("写入的bytes为====================>" + Arrays.toString(bytes3)); System.out.println("写入一段内容后ByteBuf为===========>" + buf.toString()); // System.out.println("8.ByteBuf中的内容为===============>" + Arrays.toString(buf.array()) + "\n"); // 随机访问索引 getByte // 顺序读 read* // 顺序写 write* // 清除已读内容 discardReadBytes // 清除缓冲区 clear // 搜索操作 // 标记和重置 // 完整代码示例:参考 // 搜索操作 读取指定位置 buf.getByte(1); // } }
package com.study.hc.net.netty.demo; import io.netty.buffer.ByteBuf; import io.netty.buffer.CompositeByteBuf; import io.netty.buffer.Unpooled; import java.nio.charset.Charset; /** * 零拷贝示例 */ public class ZeroCopyTest { @org.junit.Test public void wrapTest() { byte[] arr = {1, 2, 3, 4, 5}; ByteBuf byteBuf = Unpooled.wrappedBuffer(arr); System.out.println(byteBuf.getByte(4)); arr[4] = 6; System.out.println(byteBuf.getByte(4)); } @org.junit.Test public void sliceTest() { ByteBuf buffer1 = Unpooled.wrappedBuffer("hello".getBytes()); ByteBuf newBuffer = buffer1.slice(1, 2); newBuffer.unwrap(); System.out.println(newBuffer.toString()); } @org.junit.Test public void compositeTest() { ByteBuf buffer1 = Unpooled.buffer(3); buffer1.writeByte(1); ByteBuf buffer2 = Unpooled.buffer(3); buffer2.writeByte(4); CompositeByteBuf compositeByteBuf = Unpooled.compositeBuffer(); CompositeByteBuf newBuffer = compositeByteBuf.addComponents(true, buffer1, buffer2); System.out.println(newBuffer); } }