1.字节流和字符流的区别及应用场景
字节流以一个字节为单位进行读写操作,而字符流以两个字节为单位读写。字节流一般用于图片视频音频的流操作,而字符流一般用于中文的流数据。
2. 简述阻塞IO、非阻塞IO、多路复用IO、异步IO的概念及区别
**阻塞IO:**所谓的阻塞IO就是在读写过程发生阻塞,这个过程是当用户线程发起OI请求时,内核就会去检查数据是否就绪,如果数据还没就绪,则用户线程就会处于阻塞状态,并且会让出cpu。数据就绪后,内核才会复制数据到用户线程并返回,用户才能解除block状态。
**非阻塞IO:**当用户线程发起一个read请求后,并不需要等待,而是马上得到一个结果。如果返回结果为error,说明数据还没就绪,用户线程将继续请求read。直到数据就绪后,而且用户线程还在发起read请求,内核才把数据复制到用户线程。也就是说,整个过程中,用户线程都不会让出cpu,当数据还没就绪时,用户线程不断的询问内核数据是否就绪,一直占用cpu。
**多路复用IO:**多路复用IO模型是目前使用的比较多的模型,NIO就是典型的多路复用IO。在多路复用IO模型中,会有一个线程不断的轮询询问socket的状态,只有当socket真正有读写事件时,才真正调用实际的IO操作。多路复用IO好处主要体现在一个线程管理多个socket,而且当真正有读写事件来时才使用IO资源。另一方面,跟非阻塞IO相比它性能更多的原因在于非阻塞IO的轮询询问数据是否就绪是用户线程发起的,而多路复用IO的轮询询问是内核发起的,这个效率会高很多!
**异步IO:**这是最理想的IO模型。用户发起读写操作后,就可以继续干其他事情而不需等待。内核收到异步IO请求后就会立即返回,这就说明read请求成功了。然后内核等待数据就绪后就会把数据复制到用户线程并返回,之后再给用户线程发送一个信号告诉用户线程IO完成了。也就是整个过程,用户线程发起一个读写请求,内核就会异步执行IO,等到用户线程收到完成信号后就可以使用IO了!
3.IO与NIO的区别
io面向流,nio面向缓冲区。io阻塞,nio非阻塞。详情参考上述阻塞IO和多路复用IO模型!
**个人博客:java1024 家园**