Java I/O(1):模型与流
在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 I/O(1):模型与流的更多相关文章
- Java NIO学习系列六:Java中的IO模型
前文中我们总结了linux系统中的5中IO模型,并且着重介绍了其中的4种IO模型: 阻塞I/O(blocking IO) 非阻塞I/O(nonblocking IO) I/O多路复用(IO multi ...
- 2015年12月28日 Java基础系列(六)流
2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流
- 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
一.前言 最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实... 问题大致是这样的,“在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?”: 我当时的想 ...
- Java输入、输入、IO流 类层次关系梳理
本文主要关注在Java编程中涉及到的IO相关的类库.方法.以及对各个层次(抽线.接口继承)的流之间的关系进行梳理 相关学习资料 http://baike.baidu.com/view/1007958. ...
- JAVA基础知识之IO——IO流(Stream)的概念
Java IO 流 Java将不同的设备或载体(键盘.文件.网络.管道等)的输入输出数据统称为"流"(Stream),即JAVA的IO都是基于流的. JAVA传统的所有流类型类都包 ...
- Java基础知识强化之IO流笔记83:NIO与IO
当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...
- java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种 ...
- Java对象的内存模型(一)
前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...
- Java虚拟机:内存模型详解
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?当我们创建一个对象实 ...
随机推荐
- 如何有效地开发 Jmix 扩展组件
扩展组件的概念在使用 Jmix 框架开发中扮演着非常重要的角色.我们将在本文探索什么是扩展组件以及 Jmix Studio 在扩展组件开发和应用程序模块化方面能给开发者带来什么帮助. Jmix 中的扩 ...
- Odoo 14 升级模块后为什么template不生效?
# 升级模块后为什么template不生效? # 直接原因是因为你在record标签的父级data标签标签中设置了noupdate为true.这就导致你后面无论你怎么修改data下面的子标签内容,都不 ...
- 并发刺客(False Sharing)——并发程序的隐藏杀手
并发刺客(False Sharing)--并发程序的隐藏杀手 前言 前段时间在各种社交平台"雪糕刺客"这个词比较火,简单的来说就是雪糕的价格非常高!其实在并发程序当中也有一个刺客, ...
- 【AGC】增长服务1-远程配置示例
[AGC]增长服务1-远程配置示例 前言:上一次笔者给大家带来了AGC领域的性能管理服务的学习.这次我们再继续深化学习AGC的相关知识.在文章开始之前,再给读者简单介绍一下AGC,以免第一次来的读 ...
- MySQL:关于MGR中监控的两个重要指标简析
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 转载声明:以下文章来源于MySQL学习 ,作者八怪(高鹏) 一.两个重要的指标 ...
- Uniapp---快速生成安卓证书keystore文件
在用Uniapp开发项目的时候,APP上线,就需要用到安卓证书,当然网上有很多生成证书的教程,各种安装,各种命令,下面就介绍两种快速方便的生成证书的方法: 第一种:在线证书生成: http://www ...
- Java学习--方法
Java学习 方法 方法 定义 Java方法是语句的集合,一起执行一个功能. 方法是解决一类问题的步骤的有序组合. 方法包含在类或对象中. 方法在程序中被创建,在其他地方被引用. 设计方法的时候,最好 ...
- SpingBoot解析Excel数据
前言 在最近的工作中,由于导入模板除了前三列(姓名.手机号.实发工资)固定:其余的列不固定,并且可以做到两个模板的数据都能够正常入库进行对应业务处理. 一.数据模板数据展示: (1)模板一 (2)模板 ...
- 论文解读(PairNorm)《PairNorm: Tackling Oversmoothing in GNNs》
论文信息 论文标题:PairNorm: Tackling Oversmoothing in GNNs论文作者:Lingxiao Zhao, Leman Akoglu论文来源:2020,ICLR论文地址 ...
- 第三十三篇:关于ES6,JSON和Webpack
好家伙 1.什么是ES6? ECMAScript是javascript标准 ES6就是ECMAScript的第6个版本 (大概是一个语法标准规范) 2.什么是JSON? JSON 是什么,在数据交换中 ...