IO | NIO |
---|---|
面向流 | 面向块(缓冲) |
阻塞IO | 非阻塞 |
没有选择器 | 有选择器 |
面向流和面向块
IO面向流,从流中读取字节或字符,没有被缓存到某个地方;NIO是面向块的,首先将数据读到一个缓冲区中,可以控制读取什么位置的数据,但是需要检查缓冲区中是否有想要的数据
阻塞和非阻塞
IO流是阻塞的,也就是当一个线程读或写时,线程进入阻塞状态,知道数据被读取完或写完;NIO有阻塞模式和非阻塞模式,通过返回值判断缓冲区中是否有数据,没有数据的话可以去做别的事情,不阻塞
选择器
NIO有选择器,允许一个单独的线程来监视多个输入通道。一个选择器可以有多个通道,然后一个单独的线程监视这些通道。
例如,BufferedReader可以一次读取一行,IO是阻塞的,name调用.readLine()方法时线程阻塞,直到读取完一行才恢复。
而NIO,读取数据时,可能读了一些,但是还有些没读完,需要等待读完了才读入缓存,因此需要检查缓冲区的数据。