前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Netty 入门篇 Day 1---什么是NIO?

Netty 入门篇 Day 1---什么是NIO?

作者头像
猫头虎
发布2024-04-08 10:05:07
720
发布2024-04-08 10:05:07
举报

?? 博主猫头虎 带您 Go to New World.?? ? 博客首页——猫头虎的博客? ?《面试题大全专栏》 文章图文并茂?生动形象?简单易学!欢迎大家来踩踩~? ? 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~? ? 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~?

?? 希望本文能够给您带来一定的帮助?文章粗浅,敬请批评指正!??

一、NIO基础

Netty 入门篇 Day 1

NIO全称non-blocking IO (非阻塞IO) New 新IO 是指JDK1.4+提供的一个新的API(新IO),为所有原始数据(除boolean类型以外)提供缓存支持的 数据容器,可以对数据进行读和写操作。

1.三大组件

1.1 Channel 通道
代码语言:javascript
复制
channel通道,可以通过它 读取和写入数据。 类似于 传统IO中的 stream流。
# 区别:
1> 传统IO中的steam流 是单向的(InputStream 输入流 或 OutputStream 输出流)
2> channel是读写数据的双向通道。可以从channel中把数据读到buffer中;也可以把buffer中的数据定入channel

常见的channel有:

FileChannel 用于对文件操作的channel

DatagramChannel UDP网络编程时使用的channer

SocketChannel TCP网络编程时使用的通道,可用于server端和client端

ServerSocketChannel TCP网络编程时使用的通道,专用于server端

1.2 Buffer 缓冲区

Buffer缓冲区,用于 缓冲读或写的数据。是一个固定数据量的数据容器。 常见的缓冲区有: ByteBuffer 以字节为单位的缓冲区 ShortBuffer short为单位 IntBuffer int为单位 LongBuffer long为单位 FloatBuffer float为单位 DoubleBuffer double为单位 CharBuffer char为单位

1.3 Selector 选择器
代码语言:javascript
复制
Selector 选择器,用于 对NIO中的多个channel进行检查和选择的,检查多个channel实例 哪些已经准备好进行读写操作了,通过选择器 选择对应的channel进行数据操作。

服务器的工作方式:

1> 多线程的方式

2> 线程池的方式

3> selector的方式

2.第一个示例

代码语言:javascript
复制
步骤1> 准备一个.txt文件(e:\\data.txt),并输入简单的字符内容
	1234567890hello
步骤2> NIO的第一个示例
public class First {
    public static void main(String[] args) throws IOException {
        // 创建FileChannel对象
        FileChannel channel = new FileInputStream("e:\\data.txt").getChannel();

        // 分配缓冲区内存
        ByteBuffer buffer = ByteBuffer.allocate(10);  // 默认写操作

        // 取文件
        while (true){
            // 使用channel读数据,存入buffer
            int len = channel.read(buffer); //返回-1代表文件读取结束
            System.out.println("实际读到的字节数: " + len);
            if (len == -1) {// 检查 是否读取到文件结尾
                break;
            }
            // 显示buffer中的内容 读到了文件的正常内容,文件还没到结尾
            buffer.flip(); // 切换buffer为 读模式
            while (buffer.hasRemaining()){ // 判断buffer中是否有未读的内容
                byte b = buffer.get(); // 读取buffer区中的内容 
                System.out.println("读到的内容:" + (char)b);
            }
            buffer.clear();   // 切换buffer为 写模式
        }
    }
}

3.ByteBuffer的使用步骤

代码语言:javascript
复制
1> 往buffer中写数据,可以通过 channel.read(buffer)
2> 切换buffer为 读模式, 通过 buffer.flip()
3> 从buffer中读取数据, 调用buffer.get()
4> 切换buffer为 写模式, 通过 buffer.clear() 或 buffer.compact()

结语

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏?关注,您的支持是我坚持写作最大的动力。

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、NIO基础
    • Netty 入门篇 Day 1
      • 1.三大组件
        • 1.1 Channel 通道
        • 1.2 Buffer 缓冲区
        • 1.3 Selector 选择器
      • 2.第一个示例
        • 3.ByteBuffer的使用步骤
        • 结语
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
        http://www.vxiaotou.com