【从零开始学习IO机制 | 第一篇】I/O的演进之路

前言:

        自诞生以来,Java 一直是软件开发领域的重要一环。作为一种广泛应用于各种应用程序和系统的编程语言,Java 一直致力于提供高效、可靠的 I/O(输入/输出)操作,以满足不断增长的软件需求和用户期望。

Java I/O(Input/Output)是 Java 编程中至关重要的一部分,负责处理与外部世界的数据交换。从最早的基于流的处理方式到后来的 NIO(New I/O)和 NIO.2,Java I/O 在过去几十年间经历了令人瞩目的演进和创新。

在这篇文章中,我们将探索 Java I/O 的演进之路,从早期的基本概念和传统方法开始,一直到如今的高性能、异步处理技术。我们将深入了解每个阶段的重要里程碑和关键技术,以及它们对 Java 编程和软件开发的影响。

目录

前言:

I/O模型 

BIO:

BIO特点:

NIO:

NIO特点: 

AIO:

三种IO模式的使用场景:

总结:


I/O模型 

        简单来说:I/O模型就是选用是什么样的通道或者通信模式和架构来进行数据的传输和接收,他在很大程度上决定了程序通信的性能。

Java一共支持三种网络编程的I/O模型:BIO,NIO,BIO

BIO:

        BIO(Blocking I/O,阻塞式I/O)是 Java 中最早的 I/O 模型之一,也是最简单和最直观的一种模型。在 BIO 模型中,I/O 操作是同步阻塞的,意味着当一个线程执行一个 I/O 操作时,它将被阻塞直到该操作完成。

在 BIO 模型中,通常通过 InputStream OutputStream 来进行数据的读取和写入。例如,使用 FileInputStream 读取文件,或者使用 SocketInputStream 读取网络套接字的数据。当调用这些输入流的读取方法时,如果没有数据可读,线程将被阻塞,直到数据可用为止。

我们来看一看BIO模式图:

在BIO的模式下,我们每有一个客户端,服务端就需要创建一个线程来读写当前客户端的IO需求。如此在大量的客户端下,服务端就需要创建更多的线程。

BIO特点:

  1. 阻塞等待:在进行 I/O 操作时会阻塞当前线程,直到数据准备就绪或者超时。
  2. 同步执行:程序会按照顺序执行,直到遇到 I/O 操作,然后等待 I/O 完成后再继续执行后续代码。
  3. 资源消耗较大可能需要创建大量线程来处理连接或请求,导致资源消耗较大。

NIO:

        NIO(Non-blocking I/O)是 Java 中的一种 I/O 模型,它提供了一种更为灵活和高效的 I/O 处理方式,相比传统的阻塞 I/O,NIO的服务器实现模式为一个线程处理多个请求,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理

我们来看一看NIO的模式图

NIO特点: 

  1. 非阻塞 I/O:NIO 的核心特性是非阻塞 I/O,它允许一个线程同时管理多个连接,而不会因为某个连接的 I/O 操作而阻塞整个线程。这使得在高并发的情况下,可以用较少的线程处理大量的连接,提高系统的资源利用率和并发能力。

  2. 通道(Channel)和缓冲区(Buffer):NIO 提供了 Channel 和 Buffer 两个主要的抽象概念。Channel 类似于传统 I/O 中的流(Stream),但更为灵活,可以支持双向的数据传输;而 Buffer 是数据的缓冲区,所有数据都通过 Buffer 进行传输。

  3. 选择器(Selector):选择器是 NIO 的核心组件之一,它是一个可以检查多个通道是否有事件发生的对象。通过选择器,一个线程可以同时监听多个通道的 I/O 事件,当某个通道上的事件发生时,可以立即得到通知,而不需要轮询每个通道。

  4. 事件驱动NIO 是基于事件驱动的模型,当某个 I/O 事件发生时,例如连接建立、数据可读等,会触发相应的事件通知,从而让程序能够及时响应。

  5. 多路复用:NIO 使用了多路复用的技术,通过选择器同时监听多个通道的事件,从而实现在单线程中管理多个连接的能力。

AIO:

         AIO(Asynchronous I/O)是一种异步 I/O 模型,也称为 NIO 2.0,在 Java 中引入了对异步 I/O 操作的支持。相比于传统的阻塞 I/O 和 NIO 的非阻塞 I/O,AIO 提供了更为高级和灵活的异步 I/O 操作方式。

三种IO模式的使用场景:

  1. BIO(Blocking I/O,阻塞式I/O)

    • 使用场景:BIO 适用于连接数量较少且并发要求不高的场景。例如,传统的网络编程中,当连接数量可预期且不会很多时,可以使用 BIO。

    • 典型应用单线程服务器简单的网络通信应用文件系统操作

  2. NIO(Non-blocking I/O,非阻塞式I/O)

    • 使用场景:NIO 适用于需要处理大量连接的高并发场景,如网络服务器、实时通信系统等。它通过单线程处理多个连接,提高了系统的并发处理能力。

    • 典型应用高性能网络服务器实时消息传输系统大规模文件操作等。

  3. AIO(Asynchronous I/O,异步I/O)

    • 使用场景:AIO 适用于需要处理大量并发连接,并且对性能和资源利用率有较高要求的场景。它可以在 I/O 操作完成前不阻塞线程,从而提高系统的吞吐量和响应性能。

    • 典型应用高性能网络服务器大规模文件复制和处理实时数据采集和处理等。

总的来说,选择合适的 I/O 模型取决于应用程序的具体需求和性能要求。在进行选择时,需要权衡每种模型的优缺点,并根据实际情况进行决策。

总结:

        本文讲解了Java常见的三种IO机制,在后面我们会深入这三种IO机制,用一个个案例来帮助大家更好的理解这三种IO模式的区别

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

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

相关文章

javaweb-数据库

数据库管理系统(DataBase Management System,简称DBMS) MySQL 官网:MySQL :: Developer Zone 安装 官网下载地址:MySQL :: Download MySQL Community Server (Archived Versions) 图形化工具 通常为了提高开发效…

仓库管理存在的问题及改进对策?

大部分人都指导仓库问题会影响一个仓库操作或与之相关的整个流程链的速度、效率和生产力。但在大多数情况下,只有在流程开始甚至完成后才能识别这些错误。 到那时通常已经来不及阻止错误了,甚至可能来不及减少造成的损害。 所以这也是我写这篇内容的目…

【计算机毕业设计】理发店管理系统产品功能说明——后附源码

🎉**欢迎来到我的技术世界!**🎉 📘 博主小档案: 一名来自世界500强的资深程序媛,毕业于国内知名985高校。 🔧 技术专长: 在深度学习任务中展现出卓越的能力,包括但不限于…

Linux部署MySQL8.0—手把手保姆级教程

👩🏽‍💻个人主页:阿木木AEcru 🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》 💹每一次技术突破,都是对自我能力的挑战和超越。 目录 一、下载MySQL8.0安装包二、安装MySQ…

顺序栈着三种结构定义及其初始化

定义 顺序堆栈这三种结构定义及其初始化 - 知乎 (zhihu.com) 根据以上链接得到: 1.理解为数组,top是这个数组的索引值;定义这个结构体类型时,系统不分配空间 在主函数声明时,定义了关于这个结构体的变量&#xff0c…

python基础知识三(运算符、while循环、for循环)

目录 运算符: 算术运算符: 比较运算符: 赋值运算符: 逻辑运算符: 位运算符: 成员运算符: while循环: 1. while循环的语法: 2. while循环的执行过程&#xff1a…

Docker搭建Maven仓库Nexus

文章目录 一、简介二、Docker部署三、仓库配置四、用户使用Maven五、管理Docker镜像 一、简介 Nexus Repository Manager(简称Nexus)是一个强大的仓库管理器。 Nexus3支持maven、docker、npm、yum、apt等多种仓库的管理。 建立了 Maven 私服后&#xf…

新技术前沿-2024-国内主流AI大模型架构及应用场景深度分析

参考国内主流AI 大模型架构及应用场景深度分析 2024 1 厂商总览 1.1 国外 (1)Open AI:GPT-4【美国旧金山的人工智能研究公司】 GPT-4于2023年3月14日发布,是千亿级参数的多模态预训练模型,能够支持图像和文本的输入。 (2)Anthropic(人类的):Claude【美国人工智能初创公司…

【前端技术】HTML基础入门篇

1.1 HTML简介 ​ HTML(HyperText Markup Language:超文本标记语言)是一种标识性的语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组…

【嵌入式AI部署神经网络】STM32CubeIDE上部署神经网络之指纹识别(Pytorch)——篇一|环境搭建与模型初步部署篇

前言:本篇主要讲解搭建所需环境,以及基于pytorch框架在stm32cubeide上部署神经网络,部署神经网络到STM32单片机,本篇实现初步部署模型,没有加入训练集与验证集,将在第二篇加入。篇二详细讲解STM32CubeIDE上…

NestJS必备:TypeORM对DB的操作

文章概叙 本文大概1300字,讲的是一些关于TypeORM的基础知识以及在NestJS中使用TypeORM操作DB的例子。 关于TypeORM TypeORM 是一个ORM框架,它可以运行在 NodeJS、Browser、Cordova、PhoneGap、Ionic、React Native、Expo 和 Electron 平台上&#xff0…

Kubectl常见排查pod问题命令

一.查看命名空间pod及其日志 #查看命名空间pod kubectl get pods -n <命名空间名称> #该命令不加-n命名空间名称&#xff0c;默认是查看default命名空间的pod#查看对应pod的日志kubectl logs -f <pod-name> -n <namespace>#同样的如果查看的是default命名空…

jasypt组件死锁bug案例分享

事故描述 1、上午9.55发布了一个Apollo动态配置参数&#xff1b; 2、片刻后&#xff0c;服务器接口开始出现大量的超时告警&#xff0c;似乎是某资源被耗尽不足分配&#xff1b; 3、正值业务请求高峰的上午十点&#xff08;平台上午10点会有一些活动会拉一波用户流量&#x…

使用eNSP进行路由策略与引入实验

一、实验拓扑 二、实验要求 1、按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 上使用 oopback 口模拟业务网段&#xff0c; 2、R2&#xff0c;R3 和 R4 运行 OSPF&#xff0c;各自协议内部互通2R1和R2运丁RIPv2 3、在 RIP 和 OSPF 间配黑双向路由引入&#…

按照以下步骤使用Transformer模型

“Transformer”是一种深度学习模型架构&#xff0c;用于处理序列数据&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;领域中表现出色。它由Google Brain团队于2017年提出&#xff0c;并在机器翻译任务中取得了突破性的成果。Transformer的核心思想是完全基于自注…

捕捉信号的处理

文章目录 信号捕捉 信号捕捉 信号捕捉是进程从内核态返回用户态时会对信号进行检测处理。 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 用户程序注册了SIGQUIT信号的处…

退役军人档案管理系统|DW-S403是一套成熟系统

退役军人档案管理系统是一种专门用于管理退役军人档案的信息系统&#xff0c;旨在提高退役军人档案的管理效率和利用价值。该系统采用先进的信息技术手段&#xff0c;对退役军人的档案进行全面、精准、高效的管理&#xff0c;为退役军人的就业、社保、优抚安置等提供有力支持。…

机器学习(XgBoost)预测顶和底

之前的文章中&#xff0c;我们对中证1000指数进行了顶和底的标注。这一篇我们将利用这份标注数据&#xff0c;实现机器学习预测顶和底&#xff0c;并探讨一些机器学习的原理。 我们选取的特征非常简单–上影线和WR&#xff08;William’s R&#xff09;的一个变种。选取这两个…

【python】python新闻文本数据统计和聚类 (源码+文本)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Appium一本通

Appium介绍 概念&#xff1a;Appium是一个移动App(手机应用)自动化工具。 用途&#xff1a;重复性任务、爬虫、自动化测试。 特点&#xff1a;开源免费、多平台支持(ios\android)、多类型支持(native\webview)、类selenium支持多语言(java\python\js\ruby) Appium原理 三个主…