第一个NIO开发演示

news2024/11/15 6:28:10

文章目录

  • Channel简介
  • Buffer简介
  • 第一个NIO程序分析

在这里插入图片描述

上一篇文章 介绍了传统网络编程在处理高并发和大规模应用时通常面临性能瓶颈和资源管理问题,而 NIO 通过非阻塞 I/O 和选择器机制提供了更高效的解决方案。虽然 NIO 的 API 更复杂,但在高负载和高性能需求的场景下,它能够显著改善传统阻塞 I/O 的不足。

这篇文章, 了解下NIO的基本开发:

在NIO中不再选择流的通信方式, 而是选择管道的方式.

每个客户端对应一个管道, 来自客户端的请求通过管道发给服务端.

NIO 为服务端在网络通信中引入了 Seletor , Seletor监控客户端的状态 , 使得服务端的有限线程充分复用起来.


NIO 有两个核心: ChannelBuffer

Channel简介

  1. Channel是IO通信的通道,类似于InputStream、OutputStream
  2. Channel没有方向性, 读取和写入都是用Channel
  • 常见Channel

    1. 文件操作
       FileChannel,读写文件中的数据。
    2. 网络操作
       SocketChannel,通过TCP读写网络中的数据。
       ServerSockectChannel,监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。
       DatagramChannel,通过UDP读写网络中的数据。
    
  • 获得方式

    1. FileInputStreanm/FileOutputStream
    2. RandomAccessFile
    3. FileChannel.open();
    
    3. Socket
    4. ServerSocket
    5. DatagramSocket
    

Buffer简介

  1. Channel读取或者写入的数据,都要写到Buffer中,才可以被程序操作。
  2. 因为Channel没有方向性,所以Buffer为了区分读写,引入了读模式、写模式进行区分。
  • 常见Buffer

    1. ByteBuffer   常用
    2. CharBuffer
    3. DoubleBuffer
    4. FloatBuffer
    5. IntBuffer
    6. LongBuffer
    7. ShortBuffer
    8. MappedByteBuffer 是ByteBuffer的子类, 直接与内存打交道 (零拷贝相关)
    
  • 获得方式

     1. ByteBuffer.allocate(10); // 一但分配空间,不可动态调整
     2. encode()
    
  • 写模式

    ①新创建 ②clean() ③compact

  • 读模式

    filp();


第一个NIO程序分析

NIO读取文件演示:

public static void main(String[] args) throws IOException {
	//	snow.txt 里写的是 hello netty
    String filePath = "D:/BaiduNetdiskDownload/snow.txt";
    //  创建 FileChannel
    FileChannel fileChannel = new FileInputStream(filePath).getChannel();

    //  创建buffer
    ByteBuffer byteBuffer = ByteBuffer.allocate(15);

    //  将数据读取进缓冲区
    fileChannel.read(byteBuffer);

    //  byteBuffer 转换为读模式
    byteBuffer.flip();
    //  打印数据
    while( byteBuffer.hasRemaining() ){
        System.out.print((char) byteBuffer.get());
    }
    
    //  将 byteBuffer 重置为写模式
    byteBuffer.clear();
}

上面的代码有个问题就是 , 当我的 snow.txt 里的数据大于 15 个字节的时候, 后面的数据是读取不到的.

改造上面的代码

public static void main(String[] args) throws IOException {
	//	snow.txt 里写的是 hello netty! study netty!
    String filePath = "D:/BaiduNetdiskDownload/snow.txt";
    //  创建 FileChannel
    FileChannel fileChannel = new FileInputStream(filePath).getChannel();

    //  创建buffer
    ByteBuffer byteBuffer = ByteBuffer.allocate(15);

    while ( true ){
        //  将数据读取进缓冲区
        int read = fileChannel.read(byteBuffer);
        if( read == -1 ){
            break;
        }
        //  byteBuffer 转换为读模式
        byteBuffer.flip();
        //  打印数据
        while( byteBuffer.hasRemaining() ){
            System.out.print((char) byteBuffer.get());
        }

        //  将 byteBuffer 重置为写模式
        byteBuffer.clear();
    }
}

现在, 即使将 snow.txt 里的数据追加一些使其大于 15 字节, 也没有问题了.


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

先从路径优化开始学习FastPlanner之B样条曲线平滑路径(一):从拉格朗日插值到B样条曲线

参考B站视频学习 注:我会列出学习他人的博客,但我不涉及具体推导,原理讲解,旨在于理解必须概念后写代码出效果。 给若干点如何获得一条平滑的曲线? 两个方法插值、拟合 插值要经过给定点,拟合不用经过。 经…

Hostease的Windows虚拟主机如何设置错误页面

404错误设置主要用于定义当访问网站上不存在的页面时服务器应该如何响应。通常,404错误表示请求的页面或资源不存在。在Plesk面板中,你可以通过404错误设置来配置服务器对这种情况的处理方式。下面我就介绍如何在Hostease的Windows虚拟主机中设置404错误…

探索数据结构:图(一)之邻接矩阵与邻接表

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 图的定义 **图(Graph)**是数学和计算机科学中…

Mybatis-plus 创建自定义 FreeMarker 模板详细教程

FreeMarker 自定义模板官方步骤 网址:https://baomidou.com/reference/new-code-generator-configuration/#%E6%A8%A1%E6%9D%BF%E9%85%8D%E7%BD%AE-templateconfig (页面往最下面拉为自定义模板相关内容) 创建自定义FreeMarker 模板及使用…

案例分享—优秀ui设计作品赏析

多浏览国外优秀UI设计作品,深入分析其设计元素、色彩搭配、布局结构和交互方式,以理解其背后的设计理念和趋势。 在理解的基础上,尝试将国外设计风格中的精髓融入自己的设计中,同时结合国内用户的审美和使用习惯,进行创…

趣味算法------试用 6 和 9 组成的最大数字

目录 ​编辑 题目描述 解题思路 具体代码 总结 题目描述 给你一个仅由数字 6 和 9 组成的正整数 num。 你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 。 请返回你可以得到的最大数字。 输入格式 一个整数 输出格式 一个整数 输入输出…

【机器学习】决策树------迅速了其基本思想,Sklearn的决策树API及构建决策树的步骤!!!

目录 🍔 案例剖析 🍔 通过sklearn实现决策树分类并进一步认识决策树 🍔 基于规则构建决策树 🍔 构建决策树的三个步骤 🍔 小结 学习目标 🍀 了解决策树算法的基本思想 🍀 了解Sklearn的决策…

Linux WPA/WPA2/WPA3/IEEE 802.1X Supplicant

参考:wpa_supplicant 终端连接 wifi — Linux latest 文档 (gnu-linux.readthedocs.io) 为了管理无线网卡驱动,并且能正常连接到无线网络,你需要一个无线连接管理工具。 如何选择一个最佳的管理方法,将依赖于下面几个因素&#xf…

【数据结构】—— 树和二叉树

1、树的概念2、树的相关术语3、树的常见表示方法4、树的实际应用5、二叉树的相关概念和性质6、二叉树的顺序存储(堆)6.1 堆的概念6.2 堆的结构和接口6.3 堆的初始化和销毁6.4 堆的插入6.5 堆的删除6.5 取堆顶数据6.6 获取有效节点个数6.7 判空6.8 源代码…

免费SSL证书申请流程开启HTTPS,以及3个月到期解决方法

阿里云免费SSL证书申请流程2024年最新申请教程,阿里云免费SSL证书品牌是Digicert,免费单域名证书,一个阿里云账号可以免费申请20张SSL免费证书,免费时长为3个月(之前是一年免费时长),免费SSL证书…

【Java并发】变量的内存存储、线程安全分析

要理解原因,首先要清楚局部变量是什么?局部变量的存储方式是什么? 局部变量,从名字上就可以知道,它是只在特定作用域内可见并且只能在该作用域内使用的变量。也就意味着不同作用域的局部变量是不共享的。在多线程环境下…

Apache Tomcat与反向代理

Apache Tomcat 是一个开源的 Java Servlet 容器,主要用于部署和运行基于 Java 的 Web 应用程序。Tomcat 提供了一个环境,让开发者能够使用 Java 编写的 Web 应用程序在 Web 服务器上运行。下面是对 Tomcat 的详细介绍: Tomcat 的历史 Tomca…

C++学习笔记——三角形面积

一、题目描述 二、代码 #include <iostream> #include <bits/stdc.h> using namespace std; int main() {double a0,b0,c0;cin >> a >> b >> c;double p(abc)/2;double dp * (p-a)* (p-b)* (p-c);cout<< fixed << setprecision(3)&l…

QT 简易网页信息抓取程序模板基础代码

有些网页爬不了&#xff0c;只是一个简单的代码。 项目结构 NetBugBaseCode.pro #------------------------------------------------- # # Project created by QtCreator 2024-08-26T15:13:10 # #-------------------------------------------------QT core gui netw…

抖音小红书爆款预定,Tiktok爆火的短视频玩法,Ai生成宝宝走秀视频,萌翻全场

大家好&#xff0c;我是方知有&#xff0c;每天分享一个互联网副业&#xff0c;喜欢的朋友可以关注~ 今天给大家分享在Tiktok爆火的短视频玩法&#xff0c;现在抖音小红书制作这类型视频的人数还不多&#xff0c;大家可以赶快操作起来&#xff0c;这个玩法就是用Ai生成宝宝走秀…

论坛测试报告1.0

版本号&#xff1a; 作者&#xff1a; 日期&#xff1a; 目录 1 引言1.1 项目概述1.2 文档概述1.2.1 编写目的1.2.2 读者对象 1.3 产品需求和设计文档 2 测试执行2.1测试工具2.2制定测试计划2.3设计测试用例2.4执行测试用例 3.测试结果4.遗留风险5.测试结果评估 1 引言 1.1 项…

【kubernetes】Pod生命周期-启动钩子、停止钩子

一&#xff0c;Pod的生命周期 pod从开始创建到终止退出的时间范围称为Pod生命周期。pod生命周期包含以下几个重要流程&#xff1a; 初始化容器&#xff08;initContainers&#xff09;。 一个pod可以拥有任意数量的init容器。init容器是按照顺序以此执行的&#xff0c;并且仅…

HAL库:中断 方式按键检测:抬起执行、按下执行、长按短按检测、延时执行

目录 HAL库&#xff1a;中断 方式按键检测&#xff1a;抬起执行、按下执行、长按短按检测、延时执行 注意事项&#xff1a; 初始化部分&#xff1a; 回调函数部分 HAL库&#xff1a;中断 方式按键检测&#xff1a;抬起执行、按下执行、长按短按检测、延时执行 注意事项&am…

如何在CMD/PowerShell中使用命令行管理IIS

使用通用IIS命令行管理工具&#xff1a; C:\Windows\System32\inetsrv\appcmd.exe 查看现有站点 1 appcmd list site 添加一个新站点 1 appcmd add site /name:"My New Site" /id:2 /bindings:http/*:81: /physicalPath:"c:\inetpub\mynewsite" /name …

559. N 叉树的最大深度(迭代法)

目录 一&#xff1a;题目&#xff1a; 二&#xff1a;代码&#xff1a; 三&#xff1a;结果&#xff1a; 一&#xff1a;题目&#xff1a; 给定一个 N 叉树&#xff0c;找到其最大深度。 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。 N 叉树输入按层序遍历…