返回顶部
首页 > 资讯 > 后端开发 > Python >浅谈Java中IO和NIO的本质和区别
  • 217
分享到

浅谈Java中IO和NIO的本质和区别

2024-04-02 19:04:59 217人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录io的本质DMA和虚拟地址空间IO的分类IO和NIO的区别IO的本质 IO的作用就是从外部系统读取数据到java程序中,或者把java程序中输出的数据写回到外部系统。这里的外部系

IO的本质

IO的作用就是从外部系统读取数据到java程序中,或者把java程序中输出的数据写回到外部系统。这里的外部系统可能是磁盘,网络流等等。

因为对所有的外部数据的处理都是由操作系统内核来实现的,对于java应用程序来说,只是调用操作系统中相应的接口方法,从而和外部数据进行交互。

所有IO的本质就是对Buffer的处理,我们把数据放入Buffer供系统写入外部数据,或者从系统Buffer中读取从外部系统中读取的数据。如下图所示:

用户空间也就是我们自己的java程序有一个Buffer,系统空间也有一个buffer。所以会出现系统空间缓存数据的情况,这种情况下系统空间将会直接返回Buffer中的数据,提升读取速度。

DMA和虚拟地址空间

在继续讲解之前,我们先讲解两个操作系统中的基本概念,方便后面我们对IO的理解。

现代操作系统都有一个叫做DMA(Direct memory access)的组件。这个组件是做什么的呢?

一般来说对内存的读写都是要交给CPU来完成的,在没有DMA的情况下,如果程序进行IO操作,那么所有的CPU时间都会被占用,CPU没法去响应其他的任务,只能等待IO执行完成。这在现代应用程序中是无法想象的。

如果使用DMA,则CPU可以把IO操作转交给其他的操作系统组件,比如数据管理器来操作,只有当数据管理器操作完毕之后,才会通知CPU该IO操作完成。现代操作系统基本上都实现了DMA。

虚拟地址空间也叫做(Virtual address space),为了不同程序的互相隔离和保证程序中地址的确定性,现代计算机系统引入了虚拟地址空间的概念。简单点讲可以看做是跟实际物理地址的映射,通过使用分段或者分页的技术,将实际的物理地址映射到虚拟地址空间。

对于上面的IO的基本流程图中,我们可以将系统空间的buffer和用户空间的buffer同时映射到虚拟地址空间的同一个地方。这样就省略了从系统空间拷贝到用户空间的步骤。速度会更快。

同时为了解决虚拟空间比物理内存空间大的问题,现代计算机技术一般都是用了分页技术。

分页技术就是将虚拟空间分为很多个page,只有在需要用到的时候才为该page分配到物理内存的映射,这样物理内存实际上可以看做虚拟空间地址的缓存。

虚拟空间地址分页对IO的影响就在于,IO的操作也是基于page来的。

比较常用的page大小有:1,024, 2,048, 和 4,096 bytes。

IO的分类

IO可以分为File/Block IO和Stream I/O两类。

对于File/Block IO来说,数据是存储在disk中,而disk是由filesystem来进行管理的。我们可以通过filesystem来定义file的名字,路径,文件属性等内容。

filesystem通过把数据划分成为一个个的data blocks来进行管理。有些blocks存储着文件的元数据,有些block存储着真正的数据。

最后filesystem在处理数据的过程中,也进行了分页。filesystem的分页大小可以跟内存分页的大小一致,或者是它的倍数,比如 2,048 或者 8,192 bytes等。

并不是所有的数据都是以block的形式存在的,我们还有一类IO叫做stream IO。

stream IO就像是管道流,里面的数据是序列被消费的。

IO和NIO的区别

java1.0中的IO是流式IO,它只能一个字节一个字节的处理数据,所以IO也叫做Stream IO。

而NIO是为了提升IO的效率而生的,它是以Block的方式来读取数据的。

Stream IO中,input输入一个字节,output就输出一个字节,因为是Stream,所以可以加上过滤器或者过滤器链,可以想想一下WEB框架中的filter chain。在Stream IO中,数据只能处理一次,你不能在Stream中回退数据。

在Block IO中,数据是以block的形式来被处理的,因此其处理速度要比Stream IO快,同时可以回退处理数据。但是你需要自己处理buffer,所以复杂程度要比Stream IO高。

一般来说Stream IO是阻塞型IO,当线程进行读或者写操作的时候,线程会被阻塞。

而NIO一般来说是非阻塞的,也就是说在进行读或者写的过程中可以去做其他的操作,而读或者写操作执行完毕之后会通知NIO操作的完成。

在IO中,主要分为DataOutPut和DataInput,分别对应IO的out和in。

DataOutPut有三大类,分别是Writer,OutputStream和ObjectOutput。

看下他们中的继承关系:

DataInput也有三大类,分别是ObjectInput,InputStream和Reader。

看看他们的继承关系:

ObjectOutput和ObjectInput类比较少,这里就不列出来了。

统计一下大概20个类左右,搞清楚这20个类的用处,恭喜你java IO你就懂了!

对于NIO来说比较复杂一点,首先,为了处理block的信息,需要将数据读取到buffer中,所以在NIO中Buffer是一个非常中要的概念,我们看下NIO中的Buffer:

从上图我们可以看到NIO中为我们准备了各种各样的buffer类型使用。

另外一个非常重要的概念是channel,channel是NIO获取数据的通道:

NIO需要掌握的类的个数比IO要稍稍多一点,毕竟NIO要复杂一点。

以上就是浅谈Java中IO和NIO的本质和区别的详细内容,更多关于Java中IO和NIO的本质和区别的资料请关注编程网其它相关文章!

--结束END--

本文标题: 浅谈Java中IO和NIO的本质和区别

本文链接: https://www.lsjlt.com/news/127380.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅谈Java中IO和NIO的本质和区别
    目录IO的本质DMA和虚拟地址空间IO的分类IO和NIO的区别IO的本质 IO的作用就是从外部系统读取数据到java程序中,或者把java程序中输出的数据写回到外部系统。这里的外部系...
    99+
    2024-04-02
  • java中io和nio有什么区别
    java中io和nio有什么区别?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queu...
    99+
    2023-06-14
  • 浅谈Java中Lock和Synchronized的区别
    目录1. 从功能角度来看2. 从特性来看3. 从性能方面来看1. 从功能角度来看 Lock和Synchronized都是java中去用来解决线程安全问题的一个工具 2. 从特性来看 ...
    99+
    2024-04-02
  • 浅谈Java中static和非static的区别
    关于static和非static变量的区别 static 修饰的变量称为类变量或全局变量或成员变量,在类被加载的时候成员变量即被初始化,与类关联,只要类存在,static变量就存在。非static修饰的成员变量是在对象new出来的时候划分存...
    99+
    2023-05-31
    java static ava
  • 浅谈Linux 脚本 sh 和 ./ 的区别
    如果.不在PATH里面,要执行当前目录下的可执行文件,使用全路径: ./executable-file PATH是环境变量,如果将当前目录“./”添加到环境变量中,那么也可以不用“./”,直接输入当前目录下...
    99+
    2022-06-04
    浅谈 脚本 区别
  • 浅谈java中的重载和重写的区别
    目录1.重载小结:2.重写小结:总结1.重载 重载指在一个类中,具有多个相同名称的方法,他们的参数列表却不相同 (参数类型不同、参数个数不同甚至是参数顺序不同) 重载对返回类型没有要...
    99+
    2024-04-02
  • 浅谈System.getenv()和System.getProperty()的区别
    最近遇到一个需求,服务器实例需要获取当前的环境变量。经过查资料,发现环境变量可以在两个地方设置。 一、在系统层面设置环境变量 在系统层面设置环境变量,之前我们应该都操作过,以wind...
    99+
    2024-04-02
  • 浅谈Mysql8和mysql5.7的区别
    目录1.NoSql存储2.隐藏索引3.设置持久化4.UTF-8编码5.通用表表达式(CommonTableExpressions)1.NoSql存储 Mysql从5.7 版本提供了N...
    99+
    2024-04-02
  • 浅谈RedisTemplate和StringRedisTemplate的区别
    目录一、区别二、问题总结三、案例:springboot整合redis五种数据结构API1、string(字符串)类型2、hash(哈希)类型3、list(列表)类型4、set(无序集...
    99+
    2024-04-02
  • 一文浅谈:&和&&的区别
    当我们在Java中使用逻辑运算符时,经常会用到两个符号:& 和 &&。这两个符号在表达式中的作用非常重要,但是很多人容易混淆它们的使用,因此我们需要了解它们之间的区别。 一、& 和 && 的用途 & 和 && 都可以用于逻辑运算,例 in...
    99+
    2023-10-24
    java jvm 面试
  • Java NIO与IO的区别以及比较
    目录前言一、NIO的简介二、IO的传统方式三、NIO的详细介绍四. 举例说明前言 传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内...
    99+
    2024-04-02
  • 浅谈String、StringBuffer和StringBuilder的区别
    在Java开发面试经常会被问到String,StringBuider,StringBuffer区别,很多人回答得不够全面和深入,那么它们到底都有什么区别呢!三者都是用来对字符串进行操作,String通常用来定义一个变量,而StringBui...
    99+
    2019-10-22
    java入门 java String StringBuffer StringBuilder
  • 浅谈Ribbon、Feign和OpenFeign的区别
    Ribbon Ribbon 是 Netflix开源的基于HTTP和TCP等协议负载均衡组件 Ribbon 可以用来做客户端负载均衡,调用注册中心的服务 Ribbon的使用需要代码里手...
    99+
    2024-04-02
  • 浅谈HttpClient、okhttp和RestTemplate的区别
    一、HttpClient 1、pom依赖 <!--HttpClient--> <dependency> <groupId>common...
    99+
    2024-04-02
  • 浅谈SpringCloud Alibaba和SpringCloud的区别
    目录Spring Cloud Netflix 和 Spring Cloud 是什么关系?为什么有了Spring Cloud又出来个Spring Cloud Alibaba呢?Clou...
    99+
    2023-05-20
    SpringCloud SpringCloud Alibaba
  • 浅谈JS中var,let和const的区别
    目录区别1区别2区别3区别4区别5区别6区别7区别1 let和var用来声明变量,const用来声明常量。 变量就是赋值后可以改变它的值,常量就是赋值后就不能改变它的值。 当声明为对...
    99+
    2024-04-02
  • 深入浅析Java NIO中的IO模型
    这期内容当中小编将会给大家带来有关深入浅析Java NIO中的IO模型,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一.什么是同步?什么是异步  同步和异步的概念出来已经很久了,网上有关同步和异步的说法也...
    99+
    2023-05-31
    java io模型 nio
  • MySQL和Oracle的本质区别
    这篇文章主要介绍“MySQL和Oracle的本质区别”,在日常操作中,相信很多人在MySQL和Oracle的本质区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL和...
    99+
    2024-04-02
  • 浅谈vue3中ref、toRef、toRefs 和 reactive的区别
    目录一、ref——定义任意类型响应式数据二、reactive——定义响应式对象三、toRef——将一个 rea...
    99+
    2024-04-02
  • 浅谈@FeignClient中name和value属性的区别
    目录name和value属性的区别name和url属性的作用定义场景解释name和value属性的区别 从源码可以得知,name是value的别名,value也是name的别名。 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作