Java IO NIO NIO2

参考链接: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中的,并具有以下特性:

  1. NIO是基于块(Block)的,它以块为基本单位处理数据 (硬盘上存储的单位也是按Block来存储,这样性能上比基于流的方式要好一些)
  2. 为所有的原始类型提供(Buffer)缓存支持
  3. 增加通道(Channel)对象,作为新的原始 I/O 抽象
  4. 支持锁(我们在平时使用时经常能看到会出现一些.lock的文件,这说明有线程正在使用这把锁,当线程释放锁时,会把这个文件删除掉,这样其他线程才能继续拿到这把锁)和内存映射文件的文件访问接口
  5. 提供了基于Selector的异步网络I/O

所有的从通道中的读写操作,都要经过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,引入不少的新操作。



猜你喜欢

转载自blog.csdn.net/chenkaifang/article/details/80903316
今日推荐