IO(输入/输出):输入机制,程序可以读取外部数据(磁盘、光盘等存储设备)、用户输入数据;输出机制,允许程序记录运行状态,将程序数据输出到磁盘、光盘等设备中。
支持类在Java.io包中。
流:输入输出流。
NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API。NIO是为了弥补IO操作的不足而诞生的,NIO的一些新特性有:非阻塞I/O,选择器,缓冲以及管道。管道(Channel)、缓冲(Buffer) 、选择器( Selector)是其主要特征。
Java NIO和IO的主要区别
IO | NIO |
面向流Stream | 面向块Buffer |
阻塞IO | 非阻塞IO |
| 选择器Selectors |
1、面向流与面向缓冲:
面向流:从流中一次可以读取一个或多个字节,拿到读取的这些做什么你说了算,这里没有任何缓存(这里指的是使用流没有任何缓存,接收或者发送的数据是缓存到操作系统中的,流就像一根水管从操作系统的缓存中读取数据)而且只能顺序从流中读取数据,如果需要跳过一些字节或者再读取已经读过的字节,你必须将从流中读取的数据先缓存起来。
面向块:数据是先被 读/写到buffer中的,根据需要你可以控制读取什么位置的数据。这在处理的过程中给用户多了一些灵活性,然而,你需要额外做的工作是检查你需要的数据是否已经全部到了buffer中,你还需要保证当有更多的数据进入buffer中时,buffer中未处理的数据不会被覆盖。在数据处理之前必须要判断缓冲区的数据是否完整或者已经读取完毕。
2、阻塞IO和非阻塞IO
所有的Java IO流都是阻塞的,这意味着,当一条线程执行read()或者write()方法时,这条线程会一直阻塞知道读取到了一些数据或者要写出去的数据已经全部写出,在这期间这条线程不能做任何其他的事情。
Java NIO的非阻塞模式(Java NIO有阻塞模式和非阻塞模式,阻塞模式的NIO除了使用Buffer存储数据外和IO基本没有区别)允许一条线程从channel中读取数据,通过返回值来判断buffer中是否有数据,如果没有数据,NIO不会阻塞,因为不阻塞这条线程就可以去做其他的事情,过一段时间再回来判断一下有没有数据
3、选择器(Selectors)
Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。
4、那么NIO和IO适用的场景
如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,这时候用NIO处理数据可能是个很好的选择。
而如果只有少量的连接,而这些连接每次要发送大量的数据,这时候传统的IO更合适。
使用哪种处理数据,需要在数据的响应等待时间和检查缓冲区数据的时间上作比较来权衡选择。
博客:https://blog.csdn.net/u010031673/article/details/51755075
https://www.cnblogs.com/aspirant/p/8630283.html
http://ifeve.com/java-nio-vs-io/