不论是在求职面试还是在工作实践中IO都是一个程序员基本的修养,本篇是作为学习IO相关知识点的一个记录。
在jdk1.4之前java只提供了java.io包,它基于流模型实现,提供了我们熟知的file、输入流inputstream和输出流outputstream功能,它的交互方式是同步、阻塞的,线程一直堵塞直到读取输入流和写入输出流完成,是一种可靠的顺序处理机制。
优点是代码简单、直观,缺点是IO效率和和扩展性存在局限性。
我们把java.net下提供的部分IPI,例如socket,serversocket,httpurlconnection也会归到IO阻塞类库,因为网络通信同样是IO行为。
从jdk1.4开始java提供了java.nio,可以实现多路复用的、同步非阻塞的IO应用程序,同时提供更接近操作系统底层的数据高性能操作方式。NIO包含三个重要的概念:buffer是数据容器,除了boolen类型意外,buffer对基本数据类型都有对应的实现。channel是文件描述符,更低层次的抽象,类似file,更接近操作系统层面,是NIO用来实现批量式IO的一种抽象。selector是NIO实现多路复用的基础,selector可以监听注册在selector上的channel是否有channal处于就绪状态,当有channel处于就绪状态时可以唤起处理,selector基于操作系统底层的处理机制,不同的操作系统机制不同,linux是epoll,windows是iocp。
java7引入了NIO2(AIO)通过事件回调机制实现了多路复用的异步处理。可以简单理解为,应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。