IO
Java 中 IO 流分为几种?
- 按照流的流向分,可以分为输入流和输出流;
- 按照操作单元划分,可以划分为字节流和字符流;
- 按照流的角色划分为节点流和处理流。
BIO,NIO,AIO 有什么区别?
- BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
就是传统的IO,同步阻塞,服务器实现模式为⼀个连接⼀个线程,即客 户端有连接请求时服务器端就需要启动⼀个线程进⾏处理,如果这个连接不做任何事情会造 成不必要的线程开销,可以通过连接池机制改善(实现多个客户连接服务器)
BIO⽅式适⽤于连接数⽬⽐较⼩且固定的架构,这种⽅式对服务器资源要求⽐较⾼,并发局限 于应⽤中,JDK1.4 以前的唯⼀选择,程序简单易理解
- NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
NIO的数据是⾯向缓冲区Buffer的,必须从Buffer中读取或写⼊ ,支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发
- AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
当有事件触发时,服务器端得到通 知,进⾏相应的处理,完成后才通知服务端程序启动线程去处理,⼀般适⽤于连接数较多且 连接时间较长的应⽤
既然有了字节流,为什么还要有字符流?
字符流
是由Java虚拟机将字节转换得到的,问题就出在这个过程还⽐较耗时,并且如果我们不知道编码类型就很容易出现乱码问题
所以 I/O流
就⼲脆提供了⼀个直接操作字符的接口,⽅便我们平时对字符进⾏流操作。**如果⾳频⽂件、图⽚等媒体⽂件⽤字节流⽐较好,如果涉及到字符的话使⽤字符流⽐较好 **