I/O分类

I/O流、
整理的时候查阅了相关资料、部分内容来自其他博主

1.流是一组有序的数据序列,I/O流提供了一条通道程序,我们使用这个通道可以把源中的字节输送到目的地。我们经常使用I/O流与磁盘的文件打交道,但是程序的源和目的地可以使内存,键盘,鼠标等等。

输入
在这里插入图片描述
输出
在这里插入图片描述
2.流按照流向分为输入和输出流,按照操作的数据单元不同分为字节流(8字节)和字符流(16字节),按照功能不同分为节点流和处理流
3.流的分类
InputStream类是字节输入流的抽象类,是所有字节输入流的父类。InputStream类的具体层次结构如图所示:在这里插入图片描述

OutputStream类是字节输出流的抽象类,此抽象类是表示输出字节流的所有类的超类。OutputStream类的具体层次如图所示:
在这里插入图片描述

Java为字符文本的输入提供了专门一套单独的类Reader,但Reader类并不是InputStream类的替换者,只是在处理字符串时简化了编程。Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类,Reader类的具体层次结构如下图所示:
在这里插入图片描述

Writer类是字符输出流的抽象类,所有字符输出类的实现都是它的子类,Writer类的层次结构如下图所示:
在这里插入图片描述

4.特殊的流RandomAccessFile(不属于IO体系,继承object)
特殊的功能很强大,他可读可写,可以随机访问,看看、可以跳转到任意位置读写数据(getFilePointer()当前定位的位置,void seek(long pos)定位到pos位置);

5.序列化
把流保存在我们的磁盘上,可以永久的保存,当某一个程序获取到这个流时,就会恢复成原来的样子。
实现序列化必须实现Serializable接口才能使用序列化的功能,

6.明确 数据源,目的(数据的目的);
第一步:明确清楚我们所使用的I/O流类型。
InputStream、OutputStream、Reader、Writer。
数据源:就是源文件,在程序的这一角度,文件是需要读进程序的,所以使用输入流。输入流有以下两种InputStream、Reader。
数据汇:就是程序所需要执行的任务,把文件输出,所以使用的是输出流。OutputStream、Writer。

7.明确 操作的数据是否是纯文本数据
第二步:了解自己需要操作的文件是属于什么类型的,根据文件的类型决定我们需要的使用是哪一种类型的流。
纯文本数据:使用的是字符流。
非纯文本数据(例如:视频,音频等):使用的是字节流。

8.明确 要操作的具体设备。每个设备都有对应的流对象。
第三步:流的读入读出是在什么设备上
从程序的角度;
源设备:(就是我们读取的文件(内容)是在什么设备上)
硬盘:能操作File的流对象都是。File开头。
键盘:System.in
内存:数组。
网络:socket流。
目的设备:(就是我们写出的文件(内容)传输到什么设备上)
硬盘:能操作File的流对象都是。File开头。、
显示器:System.out。
内存:数组。
网络:socket流。

根据上面三步就可以明确的知道我们所需要的是哪一种流;

9.明确是否需要额外功能
第四步:是否需要提速。
判断读取文件是否需要高效率。需要的话就可以使用带有缓冲区的流。
判断是否需要编码转换,需要的话使用字符转换流。

10.NIO与传统IO的比较
NIO,即同步不堵塞,是从jdk1.4之后提供的方法来操作流的。
IO:面向流的,堵塞的IO,
NIO:面向缓冲区,非阻塞的IO
NIO是面向缓冲区的,数据读取到一个缓冲区,这个缓冲区可以稍后处理,需要的时候可以在缓冲区前后移动读取数据,增加了处理的灵活性,但得确保新的数据读入缓冲区时不要覆盖我们之前在缓存区存着的没有处理的文件
IO:面向流,每次只能从流中读取一个或多个字节,直至读取所有的字节,没有数据存放的地方,也不能够灵活的读取数据
NIO:非堵塞的,使一个线程从某通道发送请求读取数据,但他仅能得到当前可用的数据,如果目前没有数据可用的时候,就什么也不会获取,这是不会保持堵塞的状态,在数据变成可读之前可以继续做与之无关的事情,写数据也是一样,在写的中途该线程也可以去做其他的事情
IO:堵塞的,当调用rade()或者write()方法的时候,这个线程会产生堵塞,知道某一方完成类任务,才会取消堵塞,中间不能干别的事情。

	NIO主要用来处理高并发的,属于同步不堵塞
	AIO:异步不堵塞IO,JDK1.7

IO模型大致可分为同步堵塞,异步堵塞,同步不堵塞,异步不堵塞
同步阻塞IO(JAVA BIO):
同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
同步非阻塞IO(Java NIO) :
同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
异步阻塞IO(Java NIO):
此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄(如果从UNP的角度看,select属于同步操作。因为select之后,进程还需要读写数据),从而提高系统的并发性!
Java AIO(NIO.2))异步非阻塞IO:
在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值