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学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Netty学习笔记15 Netty Attribute使用

Netty学习笔记15 Netty Attribute使用

Netty学习笔记四:Echo服务和Netty项目的搭建

Netty学习笔记

Netty学习2(学习笔记)

Netty学习4(学习笔记)