java提供了IO、NIO、AIO包,用于处理输入输出。
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制
IO
IO就是我们常用的 java.io包,它基于流模型,提供了File 抽象、输入输出流等。因为是同步阻塞的,也有人称为BIO。好处就是可靠,返回后可以立刻知晓结果。
按数据分:字符流(InputStream、OutputStream)、字节流。
按操作分:输入流、输出流。
注:IO流的缓冲区是用来提高效率的。
NIO
NIO的三个主要组成部分:Channel(通道)、Buffer(缓冲区)、Selector(选择器)。它们关系可以简单下图说明:
Channel
可以通过它读取和写入数据,类似IO中的流,不过它可以用于读、写或者同时用于读写。一个Channel绑定一个Buffer。
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
Buffer
NIO有如下 buffer:
ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer
这些Buffer类型代表了不同的数据类型。换句话说,就是可以通过char,short,int,long,float 或 double类型来操作缓冲区中的字节。
Selector
Selector 对象上可以注册很多个Channel,监听各个Channel上发生的事件,当事件发生时决定Channel读写。这样使用Selector就可以做到用一个线程来处理所有的channels,毕竟线程之间的切换的代价很高。
创建selector
Selector selector = Selector.open();
注册channel