如何给女朋友解释什么是BIO、NIO和AIO?

RabbitMq安装 本文详细介绍了在CentOS7系统上离线部署RabbitMQ4.3.2的完整流程。主要内容包括:1)准备RabbitMQ安装包、Erlang依赖和socat网络工具;2)安装系统编译依赖并编译安装Erlang;3)部署RabbitMQ服务,配置环境变量和socat依赖;4)启用Web管理插件并创建管理员账号;5)配置防火墙放行端口;6)设置Systemd开机自启服务;7)提供常用运维命令。文档特别强调离线部署注意事项,包括socat依赖、版本兼容性、账号安全及主机名配置等问题,为生产环境部署提供完整解决方案 阅读详情

 

 

 

 

 

一、Java IO

IO,常协作I/O,是Input/Output的简称,即输入/输出。通常指数据在内部存储器(内存)和外部存储器(硬盘、优盘等)或其他周边设备之间的输入和输出。

输入/输出是信息处理系统(例如计算机)与外部世界(可能是人类或另一信息处理系统)之间的通信。

输入是系统接收的信号或数据,输出则是从其发送的信号或数据。

在Java中,提供了一些列API,可以供开发者来读写外部数据或文件。我们称这些API为Java IO。

IO是Java中比较重要,且比较难的知识点,主要是因为随着Java的发展,目前有三种IO共存。分别是BIO、NIO和AIO。

 

 

 

(1)Java BIO

BIO 全称Block-IO 是一种同步且阻塞的通信模式。是一个比较传统的通信方式,模式简单,使用方便。但并发处理能力低,通信耗时,依赖网速

(2)Java NIO

Java NIO,全称 Non-Block IO ,是Java SE 1.4版以后,针对网络传输效能优化的新功能。是一种非阻塞同步的通信模式。

NIO 与原来的 I/O 有同样的作用和目的, 他们之间最重要的区别是数据打包和传输的方式。原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。

面向流的 I/O 系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。

面向块的 I/O 系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的 I/O 缺少一些面向流的 I/O 所具有的优雅性和简单性。

(3)Java AIO

Java AIO,全称 Asynchronous IO,是异步非阻塞的IO。是一种非阻塞异步的通信模式。

在NIO的基础上引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。

 

 

 

 

二、三种IO的区别

首先,我们站在宏观的角度,重新画一下重点:

(1)BIO (Blocking I/O):同步阻塞I/O模式。

(2)NIO (New I/O):同步非阻塞模式。

(3)AIO (Asynchronous I/O):异步非阻塞I/O模型。

那么,同步阻塞、同步非阻塞、异步非阻塞都是怎么回事呢?

同步阻塞模式:这种模式下,我们的工作模式是先来到厨房,开始烧水,并坐在水壶面前一直等着水烧开。

同步非阻塞模式:这种模式下,我们的工作模式是先来到厨房,开始烧水,但是我们不一直坐在水壶前面等,而是回到客厅看电视,然后每隔几分钟到厨房看一下水有没有烧开。

异步非阻塞I/O模型:这种模式下,我们的工作模式是先来到厨房,开始烧水,我们不一一直坐在水壶前面等,也不隔一段时间去看一下,而是在客厅看电视,水壶上面有个开关,水烧开之后他会通知我。

阻塞VS非阻塞:人是否坐在水壶前面一直等。

同步VS异步:水壶是不是在水烧开之后主动通知人。

 

 

 

 

三、适用场景

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

 

 

四、使用方式

(1)使用BIO实现文件的读取和写入

//Initializes The ObjectUser1 user = new User1();

user.setName("hollis");

user.setAge(23);

System.out.println(user);

//Write Obj to FileObjectOutputStream oos = null;try {

oos = new ObjectOutputStream(new FileOutputStream("tempFile")); oos.writeObject(user);

} catch (IOException e) {

e.printStackTrace();

} finally {

IOUtils.closeQuietly(oos);

}//Read Obj from FileFile file = new File("tempFile");

ObjectInputStream ois = null;

try {

ois = new ObjectInputStream(new FileInputStream(file));

User1 newUser = (User1) ois.readObject();

System.out.println(newUser);

} catch (IOException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} finally {

IOUtils.closeQuietly(ois);

try {

FileUtils.forceDelete(file);

} catch (IOException e) {

e.printStackTrace();

}

}

(2)使用NIO实现文件的读取和写入

static void readNIO() {

String pathname = "C:\\Users\\adew\\Desktop\\jd-gui.cfg";

FileInputStream fin = null;

try {

fin = new FileInputStream(new File(pathname));

FileChannel channel = fin.getChannel();

int capacity = 100;// 字节

ByteBuffer bf = ByteBuffer.allocate(capacity);

int length = -1;

while ((length = channel.read(bf)) != -1) {

bf.clear();

byte[] bytes = bf.array();

System.out.write(bytes, 0, length);

System.out.println();

}

channel.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

if (fin != null) {

try {

fin.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

} static void writeNIO() {

String filename = "out.txt";

FileOutputStream fos = null;

try {

fos = new FileOutputStream(new File(filename));

FileChannel channel = fos.getChannel();

ByteBuffer src = Charset.forName("utf8").encode("你好你好你好你好你好"); int length = 0;

while ((length = channel.write(src)) != 0) {

System.out.println("写入长度:" + length);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

if (fos != null) {

try {

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

(3)使用AIO实现文件的读取和写入


 
public class ReadFromFile { public static void main(String[] args) throws Exception { Path file = Paths.get("/usr/a.txt"); AsynchronousFileChannel channel = AsynchronousFileChannel.open(file); ByteBuffer buffer = ByteBuffer.allocate(100_000); Future<Integer> result = channel.read(buffer, 0); while (!result.isDone()) { ProfitCalculator.calculateTax(); } Integer bytesRead = result.get(); System.out.println("Bytes read [" + bytesRead + "]"); } } class ProfitCalculator { public ProfitCalculator() { } public static void calculateTax() { } } public class WriteToFile { public static void main(String[] args) throws Exception { AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open( Paths.get("/asynchronous.txt"), StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE); CompletionHandler<Integer, Object> handler = new CompletionHandler<Integer, Object>() { @Override public void completed(Integer result, Object attachment) { System.out.println("Attachment: " + attachment + " " + result + " bytes written"); System.out.println("CompletionHandler Thread ID: " + Thread.currentThread().getId()); } @Override public void failed(Throwable e, Object attachment) { System.err.println("Attachment: " + attachment + " failed with:"); e.printStackTrace(); } }; System.out.println("Main Thread ID: " + Thread.currentThread().getId()); fileChannel.write(ByteBuffer.wrap("Sample".getBytes()), 0, "First Write", handler); fileChannel.write(ByteBuffer.wrap("Box".getBytes()), 0, "Second Write", handler); } } 

 

 

 

 

滴滴滴,水开了。

 

 

教你如何阅读Autosar代码(6):常量变量定义 编译器抽象应该为常量的声明和定义定义CONST宏。编译器抽象应该定义VAR宏来声明和定义变量。memclass:常量本身的分类;memclass:变量本身的分类;vartype:变量的类型;type:常量的类型; 阅读详情

相关推荐

UE5 GameplayPrediction:从预测键到弱预测的实战解析

本文深入解析UE5 GameplayPrediction系统,从预测键到弱预测的实战应用。通过多人在线游戏案例,详细讲解预测技术的核心原理、实现细节及调试技巧,帮助开发者提升玩家操作响应速度,解决高延迟环境下的预测问题。

weixin_28725949的博客 312

3D中的 obj文件格式

http://www.cnblogs.com/kex1n/archive/2011/09/23/2186351.html 接下来要介绍的模型文件格式是OBJ格式。该格式非常流行,而且可以使用大量3D建模软件导出。OBJ是一种简单的格式,它是可以用任何文本编辑器打开和保存的文本文件。准确的说,OBJ文件并不是设计用于处理与动画相关的信息,但如果有一个需要快速加载到场景中的静态对象,OB

_Witch__的专栏 5753

高精度有源积分器设计:基于罗氏线圈的电流测量方案解析

在电力系统保护、工业自动化及高精度计量领域,电流的非接触式精确测量是核心需求。传统电流互感器存在磁芯饱和、频带受限等局限,难以应对现代电力电子设备产生的复杂波形。罗氏线圈作为一种空心电流传感器,凭借其宽频带、高线性度及无饱和风险的优势,成为理想解决方案。其工作原理基于法拉第电磁感应定律,输出信号与被测电流的导数成正比,因此必须通过积分运算恢复原始电流波形。积分器的精度、稳定性及动态响应直接决定了整个测量系统的性能上限。一个设计精良的有源积分器能有效解决直流漂移、相位误差及噪声放大等挑战,在继电器保护、断路器

weixin_30036289的博客 316

深入解析“Bio”——从个人简介到生物科学的多重含义

Bio最常见的意思是个人简介,特别是在社交媒体和简历中。在正式语境下,bio 还可以指人物传记(biography)

阿正的梦工坊 6184

个人信息保护合规审计人员(中级)能力测试试卷

本文是关于个人信息保护合规审计的考试指南,包含选择题、判断题、简答题和案例分析题。选择题考察《个人信息保护法》的关键条款,如敏感信息处理、跨境传输、委托处理等合规要求。判断题测试对个人信息处理规则的理解,如撤回同意、公开信息处理等。简答题要求阐述审计流程、个人权利、委托处理义务等内容。案例分析题以互联网企业为例,分析违规行为并提出整改建议,涉及数据收集、第三方共享、自动化决策等问题。全文旨在帮助中级审计人员掌握个人信息保护的法律规定和审计实务,提升合规审计能力。

qq_41525079的博客 549

Windows 下安装 Hermes Agent 完整教程(含踩坑记录)

不支持原生 Windows,必须通过 WSL2 (Windows Subsystem for Linux 2) 运行。WSL2 是 Windows 内置的 Linux 兼容层,可以在 Windows 上运行完整的 Linux 环境。

weixin_50191542的博客 4283

BIO,NIO,AIO整理(全称,介绍,区别)

先来个例子理解一下概念,以银行取款为例:同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写)。异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS需要支持异步IO操作API)。阻塞 : ATM排队取款,你只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才...

光辉晨少的博客 3万+

ABB机器人发送实时位置给PLC

本文使用中断方式实现,多任务要订购ABB功能包 Profinet总线组变量配置 注:映射为16位和32位均可用 声明数据 VAR num CurrentExAxisPos;!外轴位置 VAR robtarget pCurrentPos;!实时位置 var intnum TrapNum;!中断号 初始化开中断 IDelete TrapNum;!中断号 CONNECT TrapNum WITH iTrapCurPos;!连接中...

澍澍爸的blog 6781

java aio事件模型_Java三种IO模型原理实例详解

Java中IO的模型分为三种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。BIO【同步阻塞】在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求...

weixin_30794381的博客 1337

SolidWorks软件安装管理程序在创建该注册表项时遇到错误: UNKNOWN\Components的解决方案

SolidWorks软件安装管理程序在创建该注册表项时遇到错误: UNKNOWN\Components的解决方案

Q82556499的博客 4176

从0到1:OpenClaw 助力单元测试代码自动化与覆盖率飞升

OpenClaw 的横空出世,宛如一道曙光,照亮了这片黑暗的领域。它作为一款强大的本地 AI 助手,拥有着令人惊叹的能力。OpenClaw 能够深入理解代码的逻辑结构,自动分析代码中的各种功能和潜在的风险点,从而精准地生成高质量的单元测试代码。它就像是一位不知疲倦的测试专家,能够快速、准确地完成那些繁琐的测试编写工作,将开发者从重复劳动中解放出来,让他们能够将更多的精力投入到更具创造性和价值的工作中。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 477

Java NIO AIO 基本概念

一、NIO 在介绍NIO编程之前,我们首先需要澄清一个概念:NIO到底是什么的简称?有人称之为New I/O,因为它相对于之前的I/O类库是新增的,所以被称为New I/O,这是它的官方叫法。但是,由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O,所以,更多的人喜欢称之为非阻塞I/O(Non-block I/O),由于非阻塞I/O更能够体现NIO的特点,...

勿忘初心 5722

【Zabbix实战之部署篇】Docker部署Zabbix+grafana监控平台

【Zabbix实战之部署篇】docker部署Zabbix+grafana监控平台

jks212454的博客 2581

漫话:如何给女朋友解释什么是BIO、NIO和AIO?

周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问题,其中包括什么是BIO、NIO和AIO?三者有什么区别?具体如何使用等问题,但是面试者回答的并不是很满意。于...

B站搜索 馆主君晓 欢迎关注~ 193

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

【IO】漫话:如何给女朋友解释什么是BIO、NIO和AIO?

目录 Java IO Java BIO Java NIO Java AIO 三种IO的区别 适用场景 使用方式 周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问题,其中包括什么是BIO、NIO和AIO?三者有什么区别?具体如何使用等问题,但是面试者回答的并不是很满意。于是我在面试评价中写道:"对Java的IO提醒理解不够深入"。恰好被女朋友看到了。 Java IO ...

凡是过往,皆为序章 261

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

bio nio aio区别_什么是BIO、NIO和AIO?

周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问题,其中包括什么是BIO、NIO和AIO?三者有什么区别?具体如何使用等问题,但是面试者回答的并不是很满意。于是我在面试评价中写道:"对Java的IO提醒理解不够深入"。恰好被女朋友看到了。Java IOIO,常协作I/O,是Input/Output的简称,即输入/输出。通常指数据在内部存储器(内存)和外部存储器(硬盘、优盘等)...

weixin_31211457的博客 538

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java|BIO、NIO、AIO

在很多面经里都有这样的问题: 说说BIO、NIO、AIO 说说Linux的IO模型 说说select、poll、epoll 最开始对这些名词一点都摸不着头脑,粗略了解了BIO、NIO、AIO是什么,其中涉及到“同步/异步、阻塞/非阻塞"这些名词,更是被搞的云里雾里。BIO是在学习JavaSE的时候,网络编程讲的内容,大概知道是怎么回事,但从来没有思考过它有什么问题。对于select、poll、...

笔记本 590

BIO、NIO、AIO分析

BIO、NIO、AIO分析 在了解BIO、NIO、AIO之前先介绍一下操作系统中的相关知识: 同步与异步 **同步:**同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。 **异步:**异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。 阻塞与非阻塞 阻塞: 阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才

cyhustertcsn的博客 397

什么是BIO、NIO和AIO?

周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问题,其中包括什么是BIO、NIO和AIO?三者有什么区别?具体如何使用等问题,但是面试者回答的并不是很满意。于...

WantFlyDaCheng的博客 201

BIO、NIO和AIO

Java IO IO,常协作I/O,是Input/Output的简称,即输入/输出。通常指数据在内部存储器(内存)和外部存储器(硬盘、优盘等)或其他周边设备之间的输入和输出。 输入/输出是信息处理系统(例如计算机)与外部世界(可能是人类或另一信息处理系统)之间的通信。 输入是系统接收的信号或数据,输出则是从其发送的信号或数据。 在Java中,提供了一些列API,可以供开发者来读写外部数据或文件。我...

Forevermark的博客 162

java io bio nio面试题_漫画:一文学会面试中常问的 IO 问题!

原标题:漫画:一文学会面试中常问的 IO 问题!作者 | 漫话编程责编 | 伍杏玲本文经授权转载自漫话编程(ID:mhcoding)周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问题,其中包括什么是BIO、NIO和AIO?三者有什么区别?具体如何使用等问题,但是面试者回答的并不是很满意。于是我在面试评价中写道:"对Java的IO提醒理解不够深入"。恰好被女朋友看到了。 Java ...

weixin_42516048的博客 222

【IO】漫话:如何给女朋友解释什么是IO中的阻塞、非阻塞、同步、异步?

目录 什么是同步和异步 什么是阻塞和非阻塞 阻塞、非阻塞和同步、异步的区别 Java中的三种IO模型 同步、异步、阻塞、非阻塞都是和IO(输入输出)有关的概念。最简单的文件读取就是IO操作。而在文件读取这件事儿上,可以有多种方式。 什么是同步和异步 说到烧水,我们都是通过热水壶来烧水的。在很久之前,科技还没有这么发达的时候,如果我们要烧水,需要把水壶放到火炉上,我们通过观察水壶内...

凡是过往,皆为序章 331

大白话搞懂什么是同步/异步/阻塞/非阻塞

前言 在最近的一些面试中,跟应聘者聊了比较多关于“同步/异步,阻塞/非阻塞”相关的话题,发现大家对于这些概念的理解都比较模糊,甚至有的同学会反问“他们不就是同一个东西吗?”。所以借着这么一个机会,我想用一些尽量简单的例子,尽量简洁的语言来聊聊自己对于这些概念的看法。 正文 这篇文章想通过一个老王“候车”的案例来解释这些概念。 同步阻塞 放假了,老王回到了乡下,由于乡下的基础设施比较差,当他在车站候...

深夜里的程序猿 3万+
上一篇: 计算时间差,你的方式或许不是最佳实践!
下一篇: 面试还不知道BeanFactory和ApplicationContext的区别?
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值