Netty学习笔记
Posted 500年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty学习笔记相关的知识,希望对你有一定的参考价值。
Netty学习笔记
1、ByteBuffer的基本使用
1、向buffer写入数据,例如调用 channer.read(buffer);
2、调用 flip() 切换至读模式;
3、从 buffer 读取数据,例如调用 buffer.get();
4、调用 clear() 或 compact() 切换至写模式
5、重复1~4步骤;
1.1、实例:
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class TestByteBuffer {
public static void main(String[] args) {
// FileChannel
// 1.输入输出流 2.RandomAccessFile
try (FileChannel channel = new FileInputStream("D:\\\\tmp\\\\hao.txt").getChannel()) {
while (true) {
// 准备缓冲器
ByteBuffer buffer = ByteBuffer.allocate(10);
// 从channel读取数据,向buffer写入
int len = channel.read(buffer);
log.debug("读取到的字节数{}", len);
if (len == -1) {
break;
}
// 打印buffer内容
buffer.flip();// 切换至读模式
while (buffer.hasRemaining()) {// 是否还有剩余未读数据
byte b = buffer.get();
log.debug("实际字节{}", (char) b);
}
buffer.clear();// 切换为写模式
}
} catch (Exception e) {
}
}
}
1.2、allocate
import java.nio.ByteBuffer;
public class TestByteBufferAllocate {
public static void main(String[] args) {
System.out.println(ByteBuffer.allocate(16).getClass());
System.out.println(ByteBuffer.allocateDirect(16).getClass());
}
}
运行结果
class java.nio.HeapByteBuffer - java 堆内存,读写效率较低,会受到GC的影响
class java.nio.DirectByteBuffer - 直接内存,读写效率高(少一次拷贝),不会受GC影响,分配效率低
1.3、ByteBuffer
分配空间
Bytebuffer buf=ByteBuffer.allocate(16);
写入数据
int len=channel.read(buf);
和
buf.put((byte)127);
读取数据
int len=channel.write(buf);
和
byte b=buf.get();
补充说明:get 方法会让position读指针向后走,如果想重复读数据
- 可以调用 rewind 方法将 postion 重新置为 0;
- 调用get(int i)方法获取索引 i 的内容,它不会移动指针;
标记+重置
// mark& reset
// mark 做一个标记,记录position位置,reset是将position重置到mark的位置
System.out.println((char)buffer.get());
System.out.println((char)buffer.get());
buffer.mark();// 加标记,索引2 的位置
System.out.println((char)buffer.get());
System.out.println((char)buffer.get());
buffer.reset();// 将postion 重置到索引2
System.out.println((char)buffer.get());
System.out.println((char)buffer.get());
以上是关于Netty学习笔记的主要内容,如果未能解决你的问题,请参考以下文章