java的IO方式

xiaoxiao2021-02-28  107

BIO-basic I/O(早期就有)

NIO - non blocking I/O(j2se1.4时加入nio库)

AIO - asynchronous I/O

1) bio

•    基于流的I/O模型 •    字节流                 InputStream和OutputStream是字节流(Byte)的输入与输出类的基类。                 InputStream和OutputStream处理8位字节流数据。 •    字符流                Reader和Writer是字节流(Char)的输入与输出类的基类。                Reader和Writer处理16位的字符流数据。 Basic I/O库的设计原则 •    Java的IO模型设计非常优秀,它使用Decorator模式和Adaptor模式,按功能划分Stream, 您可以动态装配这些Stream,以便获得您需要的功能。 •    例 Decorator:                 需要一个具有缓冲的文件输入流,则应当组合使用FileInputStream和BufferedInputStream。 •    例 Adapter:                 InputStreamReader把InputStream适配为Reader, OutputStreamWriter把OutputStream 适配为Writer;这样就架起了字节流处理类和字符流处理类间的桥梁。   Basic I/O库的特点 •    阻塞:         当发起IO的读或者写操作时,均为阻塞方式,当程序流到了流或将流写入操作系统才会释放资源。 •    一连接一线程(TCP/IP+BIO):         采用BIO编写的服务程序通常为了能处理多个连接的请求通常采取的是accept后就将此Socket 放入一个线程中处理,无论是否有真实请求,都要耗费一个线程,如不控制数量,会导致服务 器资源耗尽,这就造成采用BIO技术的服务器所能支撑的连接数是有限的。

2)NIO

Java开始提高性能相关的功能,从而使得Java在底层或者并行分布式计算 等操作上已经可以和C或Perl等语言并驾齐驱   •    NIO包(java.nio.*)引入了四个关键的抽象数据类型,它们共同解决传统的I/O类中的一些问题。 •    1. Buffer:它是包含数据且用于读写的线形表结构。其中还提供了一个特殊类用于内存映射文件的I/O操作。 •    2. Charset:它提供Unicode字符串的编码与解码操作。 •    3. Channels:包含socket,file和pipe三种管道,它实际上是双向交流的通道。 •    4. Selector:是异步IO实现的核心类,Observer模式,只要我们把需要探知的socketchannel注册到Selector,我们接着做别的事情,当有事件发生时,他会触发相应的事件。     •    NIO库的设计 •    采用了多路复用I/O(multiplexed non-blocking I/O)模型 •    Java NIO非堵塞技术实际是采取Observer模式实现的Selector类,为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,实现了流畅的I/O读写,不堵塞了。 •    Selector内部原理实际是在做一个对所注册的channel的轮询访问,一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个channel的内容。     •    NIO库的特点 •    处理大数据量的本地IO操作,性能较好。 •    使用NIO服务器端可支撑大量连接。 •    使用NIO会为客户端带来更高的性能。 •    对于连接数较多,且连接上的请求非常频繁的时候,NIO方式不会带来太大的优势。     •    NIO库存在的BUG •    1. selector.select()抛出IOException异常的处理                      http://bugs.sun.com/view_bug.do?bug_id=6693490 •    2. selector.select()不阻塞就返回的情况。                      http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6403933 •    这两种情况都会造成CPU消耗100% •    对于第一种情况,可以在异常中sleep一秒或重新创建selector •    对于第二种情况可采用SUN BUG库中的修改建议。

3)AIO

与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。  即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。  在JDK1.7中,这部分内容被称作NIO.2,主要在java.nio.channels包下增加了下面四个异步通道: AsynchronousSocketChannel AsynchronousServerSocketChannel AsynchronousFileChannel AsynchronousDatagramChannel 其中的read/write方法,会返回一个带回调函数的对象,当执行完读取/写入操作后,直接调用回调函数。

转载请注明原文地址: https://www.6miu.com/read-96272.html

最新回复(0)