参考链接:http://ifeve.com/java-io/ https://www.jianshu.com/p/07d3d421a877
不管哪一种操作系统设计,5种IO模型是必不可少的:blocking I/O、non-blocking I/O、I/O mulitplexing、signal-driver I/O和asynchronous I/O。同步和异步是针对应用程序和内核的交互而言的,一直等到数据读完再返回的是同步,直接返回的是异步。阻塞和非阻塞是对进程、线程而言的,阻塞方式下读取或者写入线程一直等待,而非阻塞方式下,读取或者写入线程立即返回一个状态值。
I/O问题是整个人机交互的核心问题,很容易形成性能瓶颈。Java的I/O操作类在包java.io下,可分为如下4组:
1、基于字节操作的I/O接口:InputStream和OutputStream;
2、基于字符操作的I/O接口:Writer和Reader;
3、基于磁盘操作的I/O接口:File;
4、基于网络操作的I/O接口:Socket。
前两组主要是传输数据的数据格式,后两组主要是传输数据的方式。
Java 1.4中, NIO被引入, 它引进了一种新的相对于流模型的新的IO模型, 为非阻塞IO提供支持. 在Java 7中, NIO2又在NIO的基础上, 引入了对异步IO的支持。
+ BIO
一个程序需要InputStream或者Reader从数据源读取数据,需要OutputStream或者Writer将数据写入到目标媒介中。Java IO中包含了许多InputStream、OutputStream、Reader、Writer的子类。这样设计的原因是让每一个类都负责不同的功能。这也就是为什么IO包中有这么多不同的类的缘故。
InputStream继承图
Reader继承图
OutputStream继承图
Writer继承图
+ 并发IO
在同一时刻不能有多个线程同时从InputStream或者Reader中读取数据,也不能同时往OutputStream或者Writer里写数据。你没有办法保证每个线程读取多少数据,以及多个线程写数据时的顺序。
+ IO异常处理
流与Reader和Writer在结束使用的时候,需要正确地关闭它们。通过调用close()方法可以达到这一点。为了避免异常将close写在try--catch--finally的finally块中,但是close本身也会抛出异常,这种情况需要通过“异常处理模板”来处理。
+ RandomAccessFile
RandomAccessFile允许你来回读写文件,也可以替换文件中的某些部分,FileInputStream和FileOutputStream则没有这样的功能。
+ File
Java IO API中的FIle类可以让你访问底层文件系统,通过File类,你可以做到以下几点:
请注意:File只能访问文件以及文件系统的元数据。如果你想读写文件内容,需要使用FileInputStream、FileOutputStream或者RandomAccessFile。
+ NIO
参考链接:http://www.php.cn/java-article-357977.html http://ifeve.com/java-nio-all/
https://blog.csdn.net/happyzwh/article/details/53437570
为什么NIO没有更早出现,因为底层的操作系统支撑技术还不成熟。
对象序列化机制允许把内存中的Java对象转换成与平台无关的二进制流,从而可以保存到磁盘或者进行网络传输,其它程序获得这个二进制流后可以将其恢复成原来的Java对象。 序列化机制可以使对象可以脱离程序的运行而对立存在。
如果需要让某个对象可以支持序列化机制,必须让它的类是可序列化(serializable),为了让某个类可序列化的,必须实现如下两个接口之一:
Serializable:标记接口,实现该接口无须实现任何方法,只是表明该类的实例是可序列化的
Externalizable
NIO是New I/O的简称,与旧式的基于流的I/O方法相对,从名字看,它表示新的一套Java I/O标 准。它是在Java 1.4中被纳入到JDK中的,并具有以下特性:
所有的从通道中的读写操作,都要经过Buffer,而通道就是io的抽象,通道的另一端就是操纵的文件。
NIO的几个关键概念:Channel、Buffer和Selector。Channel是列车,Selector是运行调度系统,Buffer是车上的座位。
标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
Channel和Buffer有好几种类型,涵盖了网络IO及文件IO,Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。
既可以从通道中读取数据,又可以写数据到通道;通道可以异步地读写;通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。
+ NIO2/AIO
Java7引入AIO
+ 总结
BIO几乎已经是老掉牙的东西,最简单,性能很差,不详说了;
NIO让人惊讶的IO性能飞跃,由于java5就开始有了,网上教程也满大街,著名的实用框架有 Netty 和 Mina,不多说了;
AIO,异步IO,这个就不是很为人所很熟知了,java7以后引入的异步IO,引入不少的新操作。