IO的主要内容
- File
- InputStream
- OutputStream
- Reader
- Writer
- RandomAccessFile
NIO有以下核心的数据抽象类型。
- Buffer
- Channels
- Selector
IO是面向流(Stream)的,NIO是面向缓冲(Buffer)的。
面向流就是每次都是流中读取一个或多个字节/字符,直至读完所有的字节/字符,不能前后移动流中的数据;面向缓冲是将数据读取到一个他稍后处理的缓冲区,需要的时候可以在缓冲区中移动。
IO中的各种流都是阻塞的,当一个线程调用read()或write()时,该线程被阻塞,直到有一些数据被读取或数据完全写入。这个线程在这个期间不能干任何事,NIO的非阻塞模式,一个线程从某个通道发出请求读取数据,但它仅能得到当前可用的数据,如果没有数据可用时,就什么都不获取,而不是保持线程阻塞,该线程还可以做其他事情。线程通常将非阻塞IO的空闲时间用于其他通道执行IO操作,所以一个单独的线程可以管理多个输入和输出通道。
Java NIO有选择器,允许一个单独的线程监视多个输入通道,可以注册多个通道使用一个选择器,可以使用一个单独的线程来选择通道:这个通道已经有可以处理的输入,或者选择以准备写入的通道。