小言_互联网的博客

JAVA IO和NIO的区别以及应用场景

428人阅读  评论(0)

概述

JAVA在JDK1.4之后引入了一个新的库NIO,其实他的作用跟IO相同,只是他们的实现方式不同,NIO的效率要高于IO。

面向流和面向缓冲

IO:面向流,阻塞IO
NIO:面向缓存,非阻塞IO,包含类:Channel(通道),Buffer(缓冲区), Selector(选择区)
IO面向流,每次从流中读取一个或者多个字节,直到读取完所有字节,在此过程中不能执行其他操作,也不能移动流中的数据。
NIO面向缓冲,将数据从通道读取到缓冲区或者从缓冲区写入通道,通过selector监听多个通道事件,实现单线程监听多个数据通道,而且数据还能在缓冲区前后移动,使处理方式更加灵活,不过需要注意的是在更多数据存入缓冲区的时候,不要覆盖缓冲区尚未处理的数据

阻塞和非阻塞

Java IO流是阻塞的,当一个线程调用read()或write()时,该线程被阻塞,直到完成整个流的读写操作后,该线程才能执行其他操作。而Java NIO是非阻塞的,利用事件驱动机制,事件收到再去触发,当一个线程发出请求读取数据,在没有得到响应之前,线程是空闲的,就不会让线程阻塞,当前线程仍然可以去执行其他操作,包括写也是一样,在此模式下一个单独的线程可以管理多个输入输出通道。

应用场景

NIO是为了弥补IO的缺陷而诞生的,但是NIO也有相应缺点,NIO每一次数据处理都是对缓冲区进行的,那么读取之前就要检查缓冲区数据是否完整或已经被读取完毕。因此少量连接,但是要传输大量数据适用于IO,而NIO适用于大量连接,却只传输少量数据,比如聊天工具等。
在此引用网上的一个例子,IO就相当于没有阀门的水管,去接水的时候,不管水到没有,接满没得,都要耗在这上面。而NIO不止是加上了一个水龙头,甚至还配了一名接水工,大家都把水桶给他,由他来调度接水,接满之后直接去拿就行了,因此在接水的时候你可以去干其他事,而不是把时间耗在等待上面,节约资源。


转载:https://blog.csdn.net/qq_33261885/article/details/101292173
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场