Java IO模型深入解析:BIO、NIO与AIO
Java IO模型深入解析:BIO、NIO与AIO
一. 前言
在Java编程中,IO(Input/Output)操作是不可或缺的一部分,它涉及到文件读写、网络通信等方面。Java提供了多种类和API来支持这些操作。本文将从IO的基础知识讲起,逐步深入,介绍Java IO的各个方面。
二. IO模型概述
2.1. IO模型分类
Java BIO:同步阻塞IO模型,服务器端为每个客户端连接创建一个线程,适用于连接数较少的场景。
Java NIO:同步非阻塞IO模型,通过选择器(Selector)监控多个通道(Channel),适用于高并发场景。
Java AIO:异步非阻塞IO模型,基于事件和回调机制,适用于大量并发连接且连接时间较长的应用。
2.2. BIO、NIO、AIO使用场景分析
- BIO:适用于连接数较少且稳定的应用,如传统的Web应用服务器。
- NIO:适用于需要处理大量并发连接的应用,如聊天服务器、弹幕系统。
- AIO:适用于连接数多且连接时间较长的应用,如相册服务器、消息队列系统。
2.3. NIO与BIO的比较
- 数据流方式:BIO以流的方式处理数据,NIO以块的方式处理数据。
- 阻塞性:BIO是阻塞的,NIO是非阻塞的。
- 编程模型:BIO基于字节流和字符流,NIO基于通道和缓冲区。
- 资源消耗:BIO为每个连接创建一个线程,资源消耗大;NIO通过选择器监控多个通道,资源消耗小。
三. BIO(同步阻塞IO)
3.1. BIO编程流程
- 服务器端启动一个ServerSocket。
- 客户端启动Socket与服务器通信。
- 服务器端为每个客户端连接创建一个线程。
- 客户端请求结束后,线程结束。
3.2. BIO应用实例
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class BIOServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(6666);System.out.println("服务器启动了");while (true) {System.out.println("等待连接....");final Socket socket = serverSocket.accept();System.out.println("连接到一个客户端");new Thread(() -> {try {InputStream inputStream = socket.getInputStream();byte[] bytes = new byte[1024];int read;while((read = inputStream.read(bytes)) != -1) {System.out.println(new String(bytes, 0, read));}} catch (IOException e) {e.printStackTrace();} finally {socket.close();}}).start();}}
}
3.3. BIO问题分析
- 线程开销:每个连接需要一个线程,资源消耗大。
- 并发限制:受限于线程数量,难以处理大量并发连接。
四. NIO(同步非阻塞IO)
4.1. NIO核心组件
- 选择器(Selector):监控多个通道的IO事件。
- 通道(Channel):进行非阻塞的IO操作。
- 缓冲区(Buffer):存储IO操作的数据。
4.2. NIO三大核心原理示意图
4.3. 缓冲区(Buffer)
4.3.1. Buffer类及其子类
Buffer是NIO中用于数据缓冲的顶层抽象类,包括ByteBuffer、CharBuffer等。
4.3.2. ByteBuffer
ByteBuffer是ByteBuffer类的基本使用,包括allocate、put、get等方法。
4.4. 通道(Channel)
4.4.1. FileChannel类
FileChannel用于文件的读写操作,常用方法有read、write、transferFrom等。
4.4.2. Selector应用
Selector用于监听多个通道的IO事件,提高并发处理能力。
五. AIO(异步非阻塞IO)
5.1. AIO基本介绍
AIO是Java 7引入的异步IO模型,基于事件和回调机制,适用于大量并发连接。
5.2. AIO的特点
- 高并发性:支持大量并发连接。
- 高吞吐量:异步读写操作,提高数据读写效率。
- 高可靠性:避免线程阻塞,提高程序可靠性。
- 简单易用:提供简单易用的API。
5.3. AIO的应用
AIO适用于需要大量并发连接且连接时间较长的应用,如相册服务器、消息队列系统。
六. 总结
BIO | NIO | AIO | |
---|---|---|---|
IO模型 | 同步阻塞 | 同步非阻塞(多路复用) | 异步非阻塞 |
编程难度 | 简单 | 复杂 | 复杂 |
可靠性 | 差 | 好 | 好 |
吞吐量 | 低 | 高 | 高 |
通过本文的介绍,相信大家对Java的BIO、NIO和AIO有了更深入的理解。选择合适的IO模型,可以显著提高程序的性能和并发处理能力。
相关文章:
Java IO模型深入解析:BIO、NIO与AIO
Java IO模型深入解析:BIO、NIO与AIO 一. 前言 在Java编程中,IO(Input/Output)操作是不可或缺的一部分,它涉及到文件读写、网络通信等方面。Java提供了多种类和API来支持这些操作。本文将从IO的基础知识讲起ÿ…...
《从C/C++到Java入门指南》- 9.字符和字符串
字符和字符串 字符类型 Java 中一个字符保存一个Unicode字符,所以一个中文和一个英文字母都占用两个字节。 // 计算1 .. 100 public class Hello {public static void main(String[] args) {char a A;char b 中;System.out.println(a);System.out.println(b)…...
Adobe国际认证详解-视频剪辑
在数字化时代,视频剪辑已成为创意表达和视觉传播的重要手段。随着技术的不断进步,熟练掌握视频剪辑技能的专业人才需求日益增长。在这个背景下,Adobe国际认证应运而生,成为全球创意设计领域的重要标杆。 Adobe国际认证是由Adobe公…...
昇思25天学习打卡营第19天|MindNLP ChatGLM-6B StreamChat
文章目录 昇思MindSpore应用实践ChatGML-6B简介基于MindNLP的ChatGLM-6B StreamChat Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 ChatGML-6B简介 ChatGLM-6B 是由清华大学和智谱AI联合研发的产品,是一个开源的、支持…...
.NET在游戏开发中有哪些成功的案例?
简述 在游戏开发的多彩世界中,技术的选择往往决定了作品的成败。.NET技术,以其跨平台的性能和强大的开发生态,逐渐成为游戏开发者的新宠。本文将带您探索那些利用.NET技术打造出的著名游戏案例,领略.NET在游戏开发中的卓越表现。 …...
搜维尔科技:我们用xsens完成了一系列高难度的运动项目并且捕获动作
我们用xsens完成了一系列高难度的运动项目并且捕获动作 搜维尔科技:我们用xsens完成了一系列高难度的运动项目并且捕获动作...
深入探讨:Node.js、Vue、SSH服务与SSH免密登录
在这篇博客中,我们将深入探讨如何在项目中使用Node.js和Vue,并配置SSH服务以及实现SSH免密登录。我们会一步步地进行讲解,并提供代码示例,确保你能轻松上手。 一、Node.js 与 Vue 的结合 1.1 Node.js 简介 Node.js 是一个基于 …...
Unity UGUI 之 Toggle
本文仅作学习笔记与交流,不作任何商业用途本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.什么是Toggle? Unity - Manual: Toggle 带复选框的开关,可…...
Git报错:error: fsmonitor--daemon failed to start处理方法
问题描述 git用了很久了,但是后面突然发现执行命令时,后面都会出现这个报错,虽然该报错好像不会影响正常的命令逻辑,但是还是感觉有天烦人,就去找了找资料。 $ git status error: fsmonitor--daemon failed to start…...
【项目】星辰博客介绍
目录 一、项目背景 二、项目功能 1. 登录功能: 2. 列表页面: 3. 详情页面: 4. 写博客: 三、技术实现 四、功能页面展示 1. 用户登录 2. 博客列表页 3. 博客编辑更新页 4.博客发表页 5. 博客详情页 五.系统亮点 1.强…...
从0开始的STM32HAL库学习6
外部时钟源选择 配置环境 选择TIM2 配置红色框图中的各种配置 时钟源选择外部时钟 2 1. 预分频器 Prescaler ,下面填0,不分频 2. 计数模式 CounterModer ,计数模式选择为向上计数 3. 自动重装寄存器 CouterPeriod ,自动重…...
Elasticsearch ILM 热节点迁移至冷节点 IO 打满、影响读写解决方案探讨
1、实战问题 ILM(索引生命周期管理) 遇到热数据迁移至冷节点时造成 IO 打满影响读写的情况。 现在采取的方案是调整索引生命周期策略,定时的将Cold phase 开启/关闭。低峰开启,高峰关闭。 就是不知道这里面会有啥坑。 热节点&…...
STM32中PC13引脚可以当做普通引脚使用吗?如何配置STM32的TAMPER?
1.STM32中PC13引脚可以当做普通引脚使用吗? 在STM32单片机中,PC13引脚可以作为普通IO使用,但需要进行一定的配置。PC13通常与RTC侵入检测功能(TAMPER)复用,因此需要关闭TAMPER功能才能将其作为普通IO使用。…...
k8s学习——创建测试镜像
创建一个安装了ifconfig、telnet、curl、nc、traceroute、ping、nslookup等网络工具的镜像,便于集群中的测试。 创建一个Dockerfile文件 # 使用代理下载 Ubuntu 镜像作为基础 FROM docker.m.daocloud.io/library/ubuntu:latest# 设置环境变量 DEBIAN_FRONTEND 为 …...
重塑水资源管理的新篇章:深度剖析智慧水利解决方案的前沿技术与应用,探索其如何推动水利行业向智能化、高效化、可持续化方向迈进
目录 一、引言 二、智慧水利的核心技术 1、物联网技术 2、大数据与云计算 3、人工智能与机器学习 4、数字孪生技术 三、智慧水利的应用实践 1、智慧河湖长制信息平台 2、智能灌溉系统 3、城市防洪排涝智慧管理系统 4、智慧水库建设 四、智慧水利的推动作用 1、提升…...
C#实现数据采集系统-查询报文处理和响应报文分析处理
发送报文处理 增加一个功能码映射关系 //功能码映射关系public readonly Dictionary<string, byte> ReadFuncCodes = new Dictionary<string, byte>();<...
【音视频】AAC编码器与ffmpeg生成AAC数据
文章目录 前言为什么使用AAC?AAC规格常见的AAC规格规格之间的区别 ffmpeg生成AAC数据 总结 前言 在音频压缩技术不断发展的过程中,AAC(Advanced Audio Coding)编码器因其出色的音质和压缩效率,逐渐成为数字音频领域的…...
Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册
Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册 前言: 什么是 MySQL? MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于Oracle 公司。MySQL 是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表中,…...
【Elasticsearch7】3-基本操作
目录 RESTful 数据格式 HTTP操作 索引操作 倒排索引 创建索引 查看所有索引 查看单个索引 删除索引 文档操作 创建文档 查看文档 编辑 全量修改 编辑局部修改 删除文档 条件删除文档 高级查询 条件查询 URL带参查询 请求体带参查询 带请求体方式的查…...
给定一整数数组,其中有p种数出现了奇数次,其他数都出现了偶数次,怎么找到这p个数?
给定一长度为m的整数数组 ,其中有p种不为0的数出现了奇数次,其他数都出现了偶数次,找到这p个数。 要求:时间复杂度不大于O(n),空间复杂度不大于O(1)。 由于时间复杂度不大于O(n),则不能在遍历数组中嵌套遍…...
RICHTEK立锜科技 WIFI 7电源参考设计
什么是WIFI 7? WiFi 7(Wi-Fi 7)是下一代Wi-Fi标准,对应的是IEEE 802.11将发布新的修订标准IEEE 802.11be –极高吞吐量EHT(Extremely High Throughput )。Wi-Fi 7是在Wi-Fi 6的基础上引入了320MHz带宽、4096-QAM、Mu…...
CUDA编程00 - 配置CUDA开发环境
第一步: 在一台装有Nvidia显卡和驱动的机器上,用nvidia-smi命令查看显卡所支持cuda版本 第二步: 到Nvidia官网下载CUDA Toolkit并安装,CUDA Toolkit Archive | NVIDIA Developer 安装时按提示下一步即可,安装完成用 …...
HTML5大作业三农有机,农产品,农庄,农旅网站源码
文章目录 1.设计来源1.1 轮播图页面头部效果1.2 栏目列表页面效果1.3 页面底部导航效果 2.效果和源码2.1 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_4…...
Spark的动态资源分配算法
文章目录 前言基于任务需求进行资源请求的整体过程资源申请的生成过程详解资源申请的生成过程的简单例子资源调度算法的代码解析 申请资源以后的处理:Executor的启动或者结束对于新启动的Container的处理对于结束的Container的处理 基于资源分配结果进行任务调度Pen…...
Python 爬虫技术 第06节 HTTP协议与Web基础知识
HTTP(Hypertext Transfer Protocol)是用于从Web服务器传输超文本到本地浏览器的传输协议。它是互联网上应用最为广泛的一种网络协议,几乎所有的网页数据都是通过HTTP协议进行传输的。下面,我将结合一个简单的Python案例来详细讲解…...
js | 原型链
为什么前者会输出Lucas 后者不会?call动作具体干了什么? http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ function Foo(){this.bar"Lucas" } let obj{}; obj.__proto__Foo.prototype; Foo.call(obj) console.log(obj.bar); // 输出Lucas/…...
Volatility:分析MS10-061攻击
1、概述 # 1)什么是 Volatility Volatility是开源的Windows,Linux,MaC,Android的内存取证分析工具。基于Python开发而成,可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统…...
水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集)
水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集) 目录 水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集) 1.前言 2. 水表数字识别的方法 3. 水表数字识别数据集 4. 水表数字分割模型训练 5. 水表数字识别模型训…...
oracle数据文件损坏和误删dbf文件处理方法
加油,新时代打工人! 打开sqlplus sqlplus> “/as sysdba” (命令行登录sqlplus) SQL>shutdown abort; (关闭oracle数据库服务器) SQL>startup mount ;(挂载oracle数据库,这…...
postMessageXss续2
原文地址如下:https://research.securitum.com/art-of-bug-bounty-a-way-from-js-file-analysis-to-xss/ 在19年我写了一篇文章,是基于postMessageXss漏洞的入门教学:https://www.cnblogs.com/piaomiaohongchen/p/14727871.html 这几天浏览mXss技术的时候ÿ…...
可以做网站AB测的软件/自建站怎么推广
0. UDP通信特点 udp 是一个面向无连接的,不安全的,报式传输层协议,udp 的通信过程默认也是阻塞的。 UDP通信不需要建立连接 ,因此不需要进行 connect () 操作UDP通信过程中,每次都需要指定数据接收端的IP和端口&…...
wordpress多站点独立域名/色盲测试图动物
如图所示,昨天晚上点了那个Download按钮,下载Fedora31,下载完成后提示要重启安装。重启之后就黑屏了,一大串白色的字: alloc magic is broken at 0xXXXX 启动不了系统,昨天晚上太晚了就没继续弄了&#x…...
郑州营销型网站制作运营/企拓客app骗局
目录HBASE架构HBASEshellHBASE的JavaAPI操作HBASE连接HiveHBASE过滤器比较器比较运算符常见的比较器过滤器常见的过滤器过滤器举例过滤器举例的所有代码HBASE架构 HBASEshell 不做概述 HBASE的JavaAPI操作 hbase的api操作总结下来就是一句话,就是 需要对表做一些…...
三好街做网站的公司/网站seo诊断
今天安装Sql Server之后,出现SQL Server只能使用Windows身份登录,不能使用sa等Sql server身份进行登录的问题是由于sql server只设置了Windows身份验证,没有设置sa登录,修改登录方式。在网上查了一下,找到了这篇文章&a…...
网站制作公司网/营销渠道模式有哪些
2019独角兽企业重金招聘Python工程师标准>>> 1. 运行时配置(php.ini) output_buffering Off display_errors On 2. 函数说明 (1)bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase…...
wordpress文章聚合/百度搜索关键词优化
使用MySQL8的时候出现 org.hibernate.exception.GenericJDBCException: Unable to open JDBC Connection for DDL execution错误。 配置文件出现了问题,与mysql 5的配置文化出现了不同 首先驱动要下载 mysql-connector-java-8.0.16.jar 点击可直接下载,官…...