Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >NIO (New I/O)

NIO (New I/O)

作者头像
happyJared
发布于 2019-08-07 07:11:59
发布于 2019-08-07 07:11:59
4640
举报
文章被收录于专栏:happyJaredhappyJared

NIO 是一种同步非阻塞的 I/O 模型,Java 1.4 中引入了 NIO 框架,对应 java.nio 包,提供了 Channel , Selector,Buffer 等抽象。

NIO 中的 N 可以理解为 Non-blocking,不单纯是 New。它支持面向缓冲的、基于通道的 I/O 操作方法。 NIO 提供了与传统 BIO 模型中的 SocketServerSocket 相对应的 SocketChannelServerSocketChannel 两种不同套接字通道的实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞 I/O 来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发。

Non-blocking IO(非阻塞IO)

IO 流是阻塞的,NIO 流是不阻塞的。

Java NIO 使我们可以进行非阻塞 IO 操作。比如说,单线程中从通道读取数据到 buffer,同时可以继续做别的事情,当数据读取到 buffer 中后,线程再继续处理数据。写数据也是一样的。另外,非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。

Java IO 的各种流是阻塞的。这意味着,当一个线程调用 read()write() 时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。

Buffer(缓冲区)

IO 面向流(Stream oriented),而 NIO 面向缓冲区(Buffer oriented)。

Buffer 是一个对象,它包含一些要写入或者要读出的数据。在 NIO 类库中加入 Buffer 对象,体现了新库与原 I/O 的一个重要区别。在面向流的 I/O 中·可以将数据直接写入或者将数据直接读到 Stream 对象中。虽然 Stream 中也有 Buffer 开头的扩展类,但只是流的包装类,还是从流读到缓冲区,而 NIO 却是直接读到 Buffer 中进行操作。

在 NIO 厍中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,写入到缓冲区中。任何时候访问 NIO 中的数据,都是通过缓冲区进行操作。

最常用的缓冲区是 ByteBuffer,一个 ByteBuffer 提供了一组功能用于操作 byte 数组。除了 ByteBuffer,还有其他的一些缓冲区,事实上,每一种 Java 基本类型(除了 Boolean 类型)都对应有一种缓冲区。

Channel (通道)

NIO 通过 Channel(通道) 进行读写。通道是双向的,可读也可写,而流的读写是单向的。无论读写,通道只能和 Buffer 交互。因为 Buffer,通道可以异步地读写。

Selectors(选择器)

NIO 有选择器,而 IO 没有。选择器用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。线程之间的切换对于操作系统来说是昂贵的。 因此,为了提高系统效率,选择器是非常有用的。

单线程中 Selector 维护3个 Channel 示意图

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

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

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot的旅游项目——day01(学习记录附赠源码)
    本项目使用的搭建方式是多模块的搭建方式。我们首先需要在Idea的工作空间中新建一个文件夹,用于存放父目录。
上分如喝水
2021/08/16
9560
SpringBoot的旅游项目——day01(学习记录附赠源码)
springboot整合redis发送手机验证码注册登录
短信验证码是通过发送验证码到手机的一种有效的验证码系统。主要用于验证用户手机的合法性及敏感操作的身份验证。常见的使用场景有:登录注册、信息修改、异常登录、找回密码等操作。 用户注册发送验证码,然后核实对比用户注册成功采用redis方式将手机号码+key放入redis缓存中设置验证码超时时间,比对用户名和验证码采用数据库存储方式,注册时拿取redis中验证码进行判读验证码是否过期是否匹配。
崔笑颜
2020/06/08
7.5K0
短信验证码登录你会吗?
今日主题:短信验证码登录 简介 相信大家在很多网站进行登录的时候,都见过短信验证码登录吧,那现在就来看看怎么实现吧 原理说明 首先我们需要一个短信发送接口,前端发送手机号码到后端,后端随机生成一个验证
java后端指南
2021/05/13
1.7K0
短信验证码登录你会吗?
【学生管理系统】环境搭建
目录 1. 环境搭建 1.1 前端环境 1.2 后端环境 1.2.1 父项目 1.2.2 domain项目 1.2.3 gateway项目 1.3 数据库环境 1.3.1 用户数据库 1.3.2 班级数据库 1.3.3 学生数据库 1.3.4 课程数据库 1. 环境搭建 1.1 前端环境 项目名:nacos-nuxt-student-fore 创建项目(整合Element ui、整合axios) 修改axios baseURL 修改Element UI 整合文件 1.2
陶然同学
2023/02/24
1.6K0
【学生管理系统】环境搭建
电商4.0项目【二】: 架构搭建
l 修改pom.xml文件,确定spring boot、spring cloud、spring cloud Alibaba 等版本
Maynor
2022/01/07
5170
电商4.0项目【二】: 架构搭建
springboot第23集:login与register代码流程
生成随机数,我发现生成5位随机数时,如果开头为0,发送的短信只有4位,这里开头加个1,保证短信的正确性
达达前端
2023/10/08
2310
springboot第23集:login与register代码流程
阿里大于短信服务_总结_01_短信验证码接入
一、代码实现 1.接入配置类—Env.java  package com.ray.sms.aliyun.config; /**@desc : 阿里大于短信服务 接入配置 * * @author: shirayner * @date : 2017年11月6日 下午6:27:53 */ public class Env { //1. 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找) public static final String ACCESSKEY_ID = "L
shirayner
2018/08/10
2.5K0
这么巧,这个项目我也做过
最近,网络上有好多播放量巨大的免费编程项目教程,很多初学编程的同学也可能都看过,这就导致了刚毕业的同学可能写在简历上的内容都差不多。
灬沙师弟
2024/04/10
1120
这么巧,这个项目我也做过
【笔记整理】SpringBoot集成腾讯云短信
前言 记录一下最近使用SpringBoot基础腾讯云里的短信产品功能的体验。 1、腾讯云申请开通短信服务。 2、配置短信内容:分别创建签名、模板和群发短信。 3、使用SpringBoot工程集成测试。
pbinlog
2022/04/18
7.9K0
【探花交友】前后端分离、开发工具、环境搭建
项目基于前后端分离的架构进行开发,前后端分离架构总体上包括前端和服务端,通常是多人协作开发
陶然同学
2023/02/26
5150
【探花交友】前后端分离、开发工具、环境搭建
SpringBoot(二) - 核心配置文件
使用注解@ConfigurationProperties(prefix = "xxx") ,必须配合@Component 注解获取在核心启动类上使用 @EnableConfigurationProperties(配置属性读取类.class)使用;
化羽羽
2022/10/25
6240
SpringBoot(二) - 核心配置文件
探花交友_搭建开发环境
此命令为部署 Redis 集群,如果本地的 docker 没有 redis 的镜像,那么他会先自动下载再部署。
wsuo
2020/10/10
1.4K0
探花交友_搭建开发环境
腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现)
前置:需要腾讯云的账号,后期授权需要,不需要买云服务器,有需要的可以购买短信套餐(几块钱)
RAIN7
2022/08/23
3.4K0
腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现)
瑞吉外卖实战项目全攻略——优化篇第一天
该系列将记录一份完整的实战项目的完成过程,该篇属于优化篇第一天,主要负责完成缓存优化问题
秋落雨微凉
2022/11/12
8781
瑞吉外卖实战项目全攻略——优化篇第一天
SpringBoot项目中快速集成腾讯云短信SDK实现手机验证码功能
大家春节好!我是程序员阿福,今天过年的日子祝大家在新的一年里健康平安、步步高升、虎年大吉大利、财源滚滚! 今天分享一篇简短一点的文章,希望在将来工作中需要的时候能够用得到,如果将来工作中需要实现短信验证码功能时可以打开我的公众号并翻到这篇文章再仔细参考我的实现思路,那么笔者分享这篇文章的用意也就达到了。
用户3587585
2022/03/09
4.4K1
SpringBoot项目中快速集成腾讯云短信SDK实现手机验证码功能
【探花交友】day00—探花交友前置Dubbo
2011年10月27日,阿里巴巴开源了自己的SOA服务化治理方案的核心框架Dubbo,服务治理和SOA的设计理念开始逐渐在国内软件行业中落地,并被广泛应用。
陶然同学
2023/04/08
5520
【探花交友】day00—探花交友前置Dubbo
尚医通-搭建环境
打开项目并点击菜单栏上的【VCS】--》【Import into version control】--》【Create Git Repository】创建本地仓库
用户9615083
2022/12/30
5900
尚医通-搭建环境
Springboot整合腾讯云短信实现系统短信登录与注册
一个登录模块,无非就是一个鉴权。现代社会,大家手机不离身,使用手机进行鉴权,并完成后续单点登录,无疑是一个不错的方法。
Mintimate
2022/03/10
7K0
Springboot整合腾讯云短信实现系统短信登录与注册
Harry技术添加存储(minio、aliyun oss)、短信sms(aliyun、模拟)、邮件发送等功能
之前后端服务的启动端口设置为9000,而现在将其修改为9999。为什么会做出这样的修改呢?这主要是由于在进行minio整合工作的时候,发现后端原本使用的9000端口与minio存储服务的端口产生了冲突。在这种情况下,为了确保整个项目的顺利运行(也方便大家在整合minio做出不必要的麻烦),经过权衡,只能做出调整,让出原本使用的端口,将后端服务的启动端口修改为9999。
Harry技术
2025/01/13
990
Harry技术添加存储(minio、aliyun oss)、短信sms(aliyun、模拟)、邮件发送等功能
Spring Cloud Alibaba 项目搭建
**分别添加 RedisTokenStoreConfig.class 、OAuthConfig.class
ruochen
2021/11/25
5810
推荐阅读
相关推荐
SpringBoot的旅游项目——day01(学习记录附赠源码)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档