Java - I/O

Java中的五种I/O模型详解 输入/输出(I/O)是计算机程序与外部环境(如文件、网络等)进行交互的方式。Java语言提供了多种I/O模型,帮助开发者处理数据读写和通信。本文将深入探讨Java中的五种I/O模型:阻塞I/O、非阻塞I/O、选择器I/O、NIO(New I/O)以及异步I/O,分析它们的工作原理、优缺点和适用场景,以帮助读者全面理解Java的I/O处理机制。 阅读详情

前言:I/O经常会使用到,脑中的概念也只有几个流相关的类,仔细研究了一下发现自己并不懂 I/O。

一、定义

IO,常写作 I/O,是 Input/Output 的简称,即输入/输出。例如从硬盘上读取数据到内存,是一次输入,将内存中的数据写入到硬盘就产生了输出。

二、读写原理

一次读写操作,比如将硬盘的内容读到内存中,原来必须通过操作系统来实现。因为为了确保操作系统的安全稳定运行,操作系统启动后,将会开启保护模式:将内存分为内核空间(内核对应进程所在内存空间)和用户空间,进行内存隔离。

内核:操作系统的核心是内核,独立于普通应用程序,可访问受保护的内存空间,也可访问底层硬件设备。

用户空间:即进程空间,可以理解为此进程使用的空间,但是此空间没有IO操作权限,需要调用系统服务来实现。

理解:你写了一个程序A,保存在磁盘里,当你点击run时加载到内存中,并分配了用户空间,当你使用read读取硬盘中内容时,你没有权限,你需要调用操作系统的API由内核来完成读操作。将内容返回到用户空间的进程缓存区中。

在这里插入图片描述

三、IO流

在这里插入图片描述

1.字节流

字节(byte)是计算机中用来表示存储容量的一个计量单位,通常情况下,一个字节有 8 位(bit)。

InputStream 类:用于从源头(通常是文件)读取数据(字节信息)到内存中,是所有字节输入流的父类。
OutputStream 类:用于将数据(字节信息)写入到目的地(通常是文件)。

2.字符流

字符(char)可以是计算机中使用的字母、数字、和符号。

Reader 类:用于从源头(通常是文件)读取数据(字符信息)到内存中。
Writer 类:用于将数据(字符信息)写入到目的地(通常是文件)

具体使用方式可查看IoTest

四、I/O 模型

1.同步阻塞IO - BIO (Blocking I/O)

应用程序从IO系统调用开始,一直到到系统调用返回,这段时间是阻塞的。
在这里插入图片描述

2.同步非阻塞 - NIO (New I/O)

应用程序从IO系统调用,会判断内核缓冲区有没有数据,没有则代表还没读到,返回失败,有的话则阻塞复制数据。
在这里插入图片描述

3.异步非阻塞 I/O - AIO (Asynchronous I/O)

用户通过系统调用,告知内核启动某个I/O操作,用户线程返回。内核将整个I/O操作执行完后,通知应用程序。
在这里插入图片描述

五、思考

三种I/O模型分别有什么优缺点,适合什么场景使用呢?

【Java】I/O 流篇 —— 字节 I/O 流 I/O流(Input/Output Stream)是计算机中数据传输的一种抽象概念,用于描述数据在程序和外部设备(如文件、网络、内存等)之间的流动方式。可以将它想象成一条“数据管道”,数据像水流一样在这条管道中连续传输。作用:I/O 流用于读写文件中的数据(可以是读写文件,或网络中的数据)。读(Read) → Input(输入)当程序从外部(如文件、键盘、网络等)获取数据时,称为“读”操作。例如:读取文件内容、接收用户键盘输入、获取网络数据等。这属于输入(Input) 阅读详情

相关推荐

本地大模型部署实战:LM Studio与Ollama的易用性与性能深度评测

本文对两款主流本地大模型部署工具LM Studio和Ollama进行了深度评测。LM Studio凭借图形化界面和内置模型库,为新手提供了开箱即用的便捷体验,并支持OpenAI兼容API,易于生态集成。Ollama则以命令行驱动,轻量高效,凭借其原生API和Modelfile自定义能力,在自动化集成和性能方面表现突出。文章从易用性、模型生态、性能及扩展性多维度对比,帮助用户根据自身技术背景和使用场景做出最佳选择。

weixin_29039773的博客 530

Java I/O模型的演变:从阻塞I/O到异步I/O的底层机制解析

以上代码示例展示了各种I/O模型的基本用法,从阻塞I/O的简单粗暴,到异步I/O的高效并发,每种模型都有其适用的场景。理解这些模型的底层机制,可以帮助我们根据实际需求选择合适的I/O模型,编写出高性能、高并发的Java应用程序。I/O模型的演进是为了解决并发问题,选择哪种模型取决于具体场景。阻塞I/O简单但并发低,非阻塞I/O解决了阻塞但消耗CPU,I/O多路复用提高并发,异步I/O实现了真正的高效并发。

weixin_41455464的博客 1496

【遥感数字图像处理(朱文泉)】第四章 变换域处理方法

变换域的处理方法

甜子yu的博客 4311

Java的I/O演进之路

一、I/O 基础入门 Java1.4之前的早期版本,对I/O的支持并不完善,开发人员在开发java高性能IO程序的时候,会面临一些巨大的挑战和困难,主要问题如下: 没有数据缓存区,IO性能存在问题 没有C或者C++的Channel概念,只有输入、输出流 同步阻塞式I/O通信(BIO),通常会让通讯线程长时间的阻塞服务端的响应 支持的字符集有限,硬件可移植性不好 在Java支持异步通讯之前的很长一段时间里,一直都是C/C++长期占据着高性能服务端程序开发的语言,Java的同步阻塞式I/O一直被人们锁所诟病

csdn5215的博客 8018

K8s入门教程(一)

本教程提供了Kubernetes(K8s)的入门指南,涵盖了从基础概念到实战操作的全面内容。首先介绍了Kubernetes的定义和核心功能,如自动化部署、弹性伸缩、自我修复等。接着,详细讲解了如何在macOS上安装Minikube和kubectl工具,以及如何使用这些工具创建和管理Pod、Deployment和Service等核心资源。教程还包括了实战案例,如部署Nginx应用,并介绍了高级特性如滚动更新和自动伸缩。最后,提供了常见问题的解决方案,帮助用户快速上手和解决实际使用中的问题。

2401_82505179的博客 1690

Unity 开发Apple Vision Pro物体识别追踪ObjectTracking

当您在 visionOS 应用中实现对象跟踪时,您可以将现实世界中的物体无缝集成到人们的周围环境中,以增强他们的沉浸式体验。通过跟踪一个或多个物体的 3D 位置和方向,您的应用可以使用虚拟内容增强它们。您可以使用对象跟踪来提供与人周围环境中的对象的虚拟交互,例如:引导某人使用某件物品的功能、阅读其历史或了解其在周围环境中的行为。使用虚拟手册帮助人们解决家居用品和电器的问题。

Cool-浩 1186

Java的I/O模型

不同的I/O模型由于线程模型、API等差别很大,所以用法的差异也非常大。

fengshi95的博客 908

OpenCL编译环境配置

在 Linux 系统上配置 OpenCL 开发环境需要安装适当的驱动、运行时和开发工具。

深之JohnChen的专栏 2003

Unix I/O与Java I/O

文章目录背景Unix I/O模型阻塞I/O模型非阻塞I/O模型I/O多路复用模型I/O多路复用技术信号驱动I/O模型异步I/O模型五种I/O模型的比较Java IO模型IO(面向流的,也叫BIO)NIOBufferChannelSelectorNIO2(AIO)Netty 背景 Unix I/O模型 I/O模型一共有哪些策略,JavaI/O是对这些策略的具体实现 阻塞I/O模型 第一阶段copy阻塞,第二阶段copy阻塞; 进程在整个recvfrom期间阻塞,即recvfrom没完成前,进程都处

qq_42647047的博客 635

别再买模块了!手把手教你用FT232RL-REEL芯片,从零设计一个USB转串口电路板

本文详细介绍了如何使用FT232RL-REEL芯片从零设计USB转串口电路板,涵盖核心器件选型、原理图设计、PCB布局布线及焊接调试等关键步骤。通过实战案例和性能对比,展示自制电路板在成本、性能和可靠性上的优势,特别适合硬件爱好者和工程师参考。

weixin_30561425的博客 434

18. 从 SAP Fiori Elements List Report 中的图片显示,谈谈背后的 XML Template 设计机制

至此,Fiori Elements List Report 这个模版里,图片显示的原理,笔者已经从开发人员层面需要定义的注解,和 Fiori Elements 框架层面如何解析这些注解,这两方面做了深入介绍。从本文开始,我们从 Fiori Elements 预制的标准 XML Template 模版的设计,来介绍我们在最终 Fiori Elements 页面看到的产品图标,是如何渲染出来的。但是,List Report 里产品的图标显示,到底是上面这些 XML 文件里的哪一个里定义的呢?

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 608

Java 网络 I/O 编程:同步阻塞 I/O,同步非阻塞 I/O 和 I/O 多路复用

Java 网络 I/O 编程:同步阻塞 I/O,同步非阻塞 I/O 和 I/O 多路复用

lybugproducer的博客 1363

21、时间触发以太网:通信、诊断、故障隔离与参数化详解

本文详细解析了时间触发以太网(TTEthernet)的核心机制,包括团检测算法、诊断服务、故障隔离策略、配置服务以及协议参数化等内容。TTEthernet是一种专为超高可靠性系统设计的网络技术,广泛应用于航空航天、工业自动化和汽车电子等领域。文章还探讨了其未来发展趋势,如技术创新与生态建设,为开发者、企业和研究机构提供了应用与发展的方向。

efc12345678的博客 110

《Java I/O》Chapter 1

Chapter1 介绍I/O 输入和输出,简称I/O,是任何计算机操作系统或编程语言的基础。只有理论家才觉得编写不需要输入或产生输出的程序很有意思。 与此同时,I/O几乎没有资格成为计算机科学中更“惊心动魄”的主题之一。它是偏向底层的技术,你每天都在使用它——但对于大多数开发者来说,它不是一个很具有吸引力的话题。 但实际上,Java程序员应该发现I/O很有趣。Java在核心API中包含了一组特别丰...

stepMore的博客 851

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java的I/O历史

Java的I/O历史

AiFlutter的博客 1253

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java I/O系统

java I/O系统

Imperial_Vmlion的博客 241

数学建模模型总结

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

常见I/O模型及Java I/O

常见I/O模型及Java I/O 分类方式(拿网上的餐馆点菜来理解) 阻塞和非阻塞: 描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。 阻塞:到饭店吃饭,一直等直到菜好了,否则不能干其他事情。例子:data = socket.read() 非阻塞:到饭店吃饭,点了菜之后可以去干其他事情。 同步和异步: 描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核

蟹黄肉松小贝的博客 210

Java I/O(一)I/O概述

I/O,内存I/O,磁盘I/O,网络I/O,Java I/O,同步 I/O,异步I/O, 阻塞I/O,非阻塞I/O

yunyun1886358的专栏 891

Java I/O基础之I/O模型分类&I/O多路复用技术

1、早期Java I/O的缺陷 Java 1.4之前的早期版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O程序的时候,会面临一些巨大的挑战和困难,主要问题如下: (1) 没有数据缓冲区,I/O性能存在问题; (2)没有C或者C++中的Channel概念,只有输入和输出流; (3)同步阻塞式I/O通信(BIO),通常会导致通信线程被长时间阻塞; (4)支持的字符...

聚沙成塔 888

Java I/O

1 File class 不要被它的名字所欺骗,它不只代表文件,确切的说应该是FilePath。 1.1 A directory lister(FilenameFilter的使用) import java.util.regex.Pattern; import java.io.FilenameFilter; import java.io.File; public class

songuo' s home 869

[zz]JAVA I/O

      在应用程序中,通常会涉及到两种类型的计算:CPU计算和I/O计算。对于大多数应用来说,花费在等待I/O上的时间是占较大比重的。通常需要等待速度较 慢的磁盘或是网络连接完成I/O请求,才能继续后面的CPU计算任务。因此提高I/O操作的效率对应用的性能有较大的帮助。本文将介绍Java语言中与I /O操作相关的内容,包括基本的Java I/O和Java NIO,着重于基本概念和最佳实践。...

yimi128 162

Java中-I/O

Java IO 流了解吗?IO 即,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因此称为 IO 流。IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

2401_86844317的博客 1201

java i o是什么意思_Java I/O简介

相对于Python和 C来说,Java的I/O操作API比较复杂,因此本文打算做个简单的介绍。1. I/O分类总的来说Java的I/O按照处理数据的粒度和方向来划分,一共可以分为4类:基于字节输入 InputStream输出 OutputStream基于字符输入 Reader输出 Writer使用原则:要读写二进制数据时,使用基于字节的API;要读写文本数据时,使用基于字符的API,文本数据操作需...

weixin_35529833的博客 598

深入理解 java I/O

Java 的 I/O 类库的基本架构 I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道。在当今这个数据大爆炸时代,I/O 问题尤其突出,很容易成为一个性能瓶颈。正因如此,所以 Java 在 I/O 上也一直在做持续的优化,如从 1.4 开始引入了 NIO,提升了 I/O 的性能。关于 NIO 我们将在后面详

Java 攻城狮~~ 1314

java i o是什么_Java I/O简介

相对于Python和 C来说,Java的I/O操作API比较复杂,因此本文打算做个简单的介绍。1. I/O分类总的来说Java的I/O按照处理数据的粒度和方向来划分,一共可以分为4类:基于字节输入 InputStream输出 OutputStream基于字符输入 Reader输出 Writer使用原则:要读写二进制数据时,使用基于字节的API;要读写文本数据时,使用基于字符的API,文本数据操作需...

weixin_28681719的博客 233
上一篇: 事务——扫盲篇
下一篇: 我的创作纪念日
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值