继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

湘王爱娟娟
关注TA
已关注
手记 101
粉丝 6
获赞 15

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

于是Java诞生了

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

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

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

http://img3.mukewang.com/634d7d6a0001b0e504410354.jpg

 


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

http://img1.mukewang.com/634d7d7300014ce003970156.jpg


 

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

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

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

http://img3.mukewang.com/634d7d7900019f2c05970364.jpg


 

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

http://img.mukewang.com/634d7d8a0001b0f605350364.jpg


 

3、I/O复用

http://img3.mukewang.com/634d7d900001d1c605350364.jpg


 

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

http://img2.mukewang.com/634d7d960001f1c206280364.jpg


 

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

http://img3.mukewang.com/634d7d9a0001b9f706120363.jpg


 

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

http://img4.mukewang.com/634d7d9f0001e64904960308.jpg


 

看看这些图就可以了也不需要深究重点还是要了解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体系

http://img3.mukewang.com/634d7da800011ce306740783.jpg


 

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

http://img4.mukewang.com/634d7dad00013e3309690610.jpg


 

按操作方式分类

http://img3.mukewang.com/634d7db20001ed5e08010840.jpg


 

按操作对象分类

http://img3.mukewang.com/634d7db70001b3f512140688.jpg


 

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

http://img4.mukewang.com/634d7dbc00013c3d11490702.jpg


http://img1.mukewang.com/634d7dc10001ec8509710679.jpg

 

 


 

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

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

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

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

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

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

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

 

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




打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP