Java提供了哪些IO方式? NIO如何实现多路复用?
IO一直是软件开发中的核心部分之一,伴随着海量数据增长和分布式系统的发展,IO扩展能力愈发重要。幸运的是,Java平台IO机制经过不断完善,虽然在某些方面仍有不足,但已经在实践中证明了其构建高扩展性应用的能力。
今天我要问你的问题是,Java提供了哪些IO方式? NIO如何实现多路复用?
典型回答
- Java IO方式有很多种,基于不同的IO抽象模型和交互方式,可以进行简单区分
- 首先,传统的java.io包,它基于流模型实现,提供了我们最熟知的一些IO功能,比如File抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序,java.io包的好处是代码比较简单、直观,缺点则是IO效率和扩展性存在局限性,容易成为应用性能的瓶颈,很多时候,人们也把java.net下面提供的部分网络API,比如Socket、ServerSocket、HttpURLConnection也归类到同步阻塞IO类库,因为网络通信同样是IO行为
- 第二,在Java 1.4中引入了NIO框架(java.nio包),提供了Channel、Selector、Bufer等新的抽象,可以构建多路复用的、同步非阻塞IO程序,同时提供了更接近操作系统底层的高性能数据操作方式
- 第三,在Java 7中,NIO有了进一步的改进,也就是NIO 2,引入了异步非阻塞IO方式,也有很多人叫它AIO(Asynchronous IO)。异步IO操作基于事件和回调机制,可以简单理解为,应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作
考点分析
- 我上面列出的回答是基于一种常见分类方式,即所谓的BIO、NIO、NIO2(AIO)
- 在实际面试中,从传统IO到NIO、NIO 2,其中有很多地方可以扩展开来,考察点涉及方方面面,比如:
- 基础API功能与设计, InputStream/OutputStream和Reader/Writer的关系和区别
- NIO、NIO 2的基本组成
- 给定场景,分别用不同模型实现,分析BIO、NIO等模式的设计和实现原理
- NIO提供的高性能数据操作方式是基于什么原理,如何使用?
- 或者,从开发者的角度来看,你觉得NIO自身实现存在哪些问题?有什么改进的想法吗?
|