首页 > 编程语言 >Java I/O(1):模型与流

Java I/O(1):模型与流

时间:2022-10-18 07:44:55浏览次数:56  
标签:异步 同步 Java 字节 字符 模型 阻塞

在1990年以前,有一帮工程师们认为未来(1990年以后)会有很多小型设备需要得到电脑操控(不得不说,想法非常超前),鉴于当时市面上并没有任何一款编程语言能够跨平台,而且能够在诸如烤面包机这种小型设备上运转,所以他们决定自己创造一个,玩一把大的。

于是Java诞生了。

为了兼顾设备之间的文件处理,Java在诞生之初就具备了文件读写能力,只不过那时候还是借用的Linux中的I/O概念。因此可以说Java的I/O体系基本上就是Linux内核I/O模型的翻版。

对于Linux而言,整个内部结构可分为三部分:底层硬件架构、内核空间和用户空间。

内核空间中存放内核代码和数据,而用户空间中存放的是不同用户应用进程的代码和数据。

 

 

 

不管是内核空间还是用户空间,它们都处于虚拟存储空间(寻址空间)中——现在很多计算机都是64位操作系统的,那么理论上,它的寻址空间就是2的64次方(264):

 

 

 

具体Linux怎么工作的就不说了,总之很牛逼。

从Java I/O出现以来,已经经历了五种模型(知道就好了,不用记,也记不住,记住了也用不着):

1、阻塞I/O(Blocking I/O)

 

 

 

2、非阻塞I/O(Non-Blocking I/O,又叫NIO)

 

 

 

3、I/O复用

 

 

 

4、信号驱动I/O(Signal Driven I/O)

 

 

 

5、异步I/O(Asynchrnous I/O,又叫AIO)

 

 

 

这五种I/O模型的分类是:

 

 

 

看看这些图就可以了,也不需要深究,重点还是要了解Java代码怎么写。

早期的Java I/O都是基于阻塞I/O模型的,也就是BIO,它分为两个部分:流式部分和非流式部分。Java对流的定义是:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的抽象——数据在设备间的传输称为流(后面的流式编程还会提到它)。

流式部分:是根据不同的数据流向,分为输入流Input和输出流Output,对输入流只能进行读操作,对输出流只能进行写操作。根据不同的数据编码,又分为字节流Byte和字符流Char,字符流的本质其实就是基于字节流读取时,通过指定的编码表将字节转换为字符,字节流可以处理所有的数据类型,而字符流只能处理字符类型的数据。

非流式部分:包含一些辅助类,如File、FileDescriptor、RandomAccessFile、SerializablePermission等,也就是直接操作具体的文件。

按数据格式,流可以分为:

字节流:以8位(即1byte,8bit)作为一个数据单元,数据流中最小的数据单元是字节。

字符流:以16位(即1char,2byte,16bit)作为一个数据单元,数据流中最小的数据单元是字符,Java中的字符是Unicode编码,一个字符占用两个字节。

依据字节流,Java定义了抽象基类InputStream/OutputStream。

而依据字符流,Java定义了抽象基类Reader/Writer。

然后Java再根据不同应用场景或功能,通过继承这两种抽象基类派生出子类,用来满足文件、网络、管道等不同场景的I/O需求,从而形成了Java的基本I/O体系。

 

 

 

按用途,流又可以分为处理流与装饰流:

 

 

 

按操作方式分类:

 

 

 

按操作对象分类:

 

 

 

一般用虚线连接的类会搭配使用:

 

 

 

 

 

 

在高性能的I/O应用中,有几个名词经常出现:同步/异步、阻塞/非阻塞、同步阻塞/同步非阻塞、异步阻塞/异步非阻塞。

同步/异步、阻塞/非阻塞,这两组概念其实说的是一个事情。

同步:用户进程触发I/O操作并等待或者轮询的去查看I/O操作是否就绪,比如上厕所这件事,就必须自己亲自干,不能一边上厕所一边逛街;

异步:用户进程触发IO操作以后就可以响应其他的任务请求,而当I/O操作完成时会得到系统通知(异步的特点就是通知),比如把衣服丢到洗衣机里你就会去干别的事情了,衣服洗好了洗衣机会通知你取出来;

阻塞:和同步一样,在程序完成指定的任务之前,什么都不干,一直等待着,直到完成任务,比如上厕所没坑了,但附近又没有别的卫生间,只好在门口一直等着;

非阻塞:和异步一样,不会为了某个任务或事件一直等待而不响应其他请求,比如你可以一边上厕所一边玩手机。

至于同步阻塞/同步非阻塞/异步阻塞/异步非阻塞,无非就是以上概念的变体而已。

 

I/O是Java中比较裹人的概念之二,非常枯燥,没办法。看看就行,理解不了那就多敲代码。

 

标签:异步,同步,Java,字节,字符,模型,阻塞
From: https://www.cnblogs.com/xiangwang1111/p/16801176.html

相关文章

  • Java开发学习(三十八)----SpringBoot整合junit
    先来回顾下 Spring整合junit@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes=SpringConfig.class)publicclassUserServiceTest{  ......
  • Java笔记
    一、Java简述1.Java历史Java是美国Sun公司在1995年推出的一门计算机高级编程语言(更接近人类自然语言)。它初期叫做Oak(橡树),但是注册商标的时候发现已经有人注册......
  • JavaScript的深拷贝和浅拷贝
    一、前言  首先,我们了解JavaScript中的数据类型主要分为:  基本数据类型:    Number、String、Boolean、null、undefined、Symbol、Bigint ......
  • Java字节码
    1.Java字节码概述1.1Java开发过程编写阶段:采用各种编辑工具,编写.java文件编译阶段:采用javac.exe对.java文件编译,产生.class文件运行阶段:采用java.exe加载.class文件......
  • javascript对象数组内元素排序
    数组内对象排序数组项是对象,需要根据数组项的某个属性对数组进行排序。注意:想往后排的,后面的-前面的  a.age-b.age,如果是从小到大排序,大的-小的letperson=[......
  • 数据库新增表后,EF通过数据库更新模型后,在视图中已经新表,但在Model 中没有出现Mode实体
    新建表t_PtoductMini, 执行Scaffold-DbContext"DataSource=.;InitialCatalog=XXX;IntegratedSecurity=True"Microsoft.EntityFrameworkCore.SqlServer-OutputDirM......
  • Java命令总结
    介绍我们在习惯使用Eclipse等集成开发工具之后,对Java的命令行还知道多少呢?还会不会使用命令行来打包一个jar文件呢?也许你会说,都已经有了集成开发工具了,为什么还要学习命令......
  • Java之Socket
    介绍网络编程是Java中很重要的一块,实现的是应用层的网络协议。本文介绍如何使用socket开发,包括有TCP和UDP的代码实现。​​关于UDP广播相关的内容,可以点击这里查看另外一篇......
  • JavaScript输入输出语句propmt、alert、console
    propmt是一个输入语句它的返回结果是你输入的内容,无论输入什么内容返回结果的数据类型都是字符串类型。alert是一个弹框输出console是控制台输出 下面代码的意思是输......
  • 基于JAVA的房地产销售系统设计与实现-计算机毕业设计源码+LW文档
    计算机科学与互联网日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。当今房地产业界日愈火暴,通常的信息了解和传播方式越来越......