今天来说说IO
IO就是input和output。简单的解释就是输入和输入,针对不同的操作对象,可以划分为磁盘I/O模型,网络I/O模型,内存映射I/O, Direct I/O、数据库I/O等,只要具有输入输出类型的交互系统都可以认为是I/O系统。那么Java是怎么操作这些IO呢。
Java 的 I/O 大概可以分成以下几类:
1. File类主要是JAVA为文件这块的操作(如删除、新增等)而设计的相关类
2. File类的包名是java.io,其实现了Serializable, Comparable两大接口以便于其对象可序列化和比较
字节流:数据流中最小的数据单元是字节.
字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节(无论中文还是英文都是两个字节)。
1. 字节流适合所有类型文件的数据传输,因为计算机字节(Byte),是电脑中表示信息含义的最小单位。字符只能够处理纯文本数据,其他数据类型不行,但是字符流处理文本比字节流处理文本要方便。
2.在读写文件需要对内容按行处理,处理行级别选择字符流,只是读写文件,与内容无关选择字节流。
使用装饰器和适配器模式
适配器模式:把一个类的接口变成客户端所期望的接口,而使两个原本接口不匹配放在一起工做
Reader reader = new INputStreamReader(inputStream);
装饰器模式:一种动态的往一个类中添加行为的模式,装饰器模式相比于子类更加灵活,其在于给某个对象加而不是整个类加。
new BufferedInputStream(new FileInputStream( inputStream));
阻塞IO和非阻塞IO
IO操作包括:对于硬盘的读写,对于socket的读写及外设的读写。
当用户发起一个IO请求操作时,内核就去查看读取的数据是否就绪,对于阻塞IO来说,如果数据没有就绪,则会一直等待,指导数据就绪,对于非阻塞IO来说,如果数据没有就绪,则会返回一个标志信息告知用户线程当前读取的数据未就绪,当数据就绪之后,便将数据拷贝到用户线程。这样才算完成了一个完整的IO请求操作。
BIO、NIO、AIO的区别
BIO:同步并阻塞,在服务器中实现模式为一个连接一个线程,当客户端发起读写请求时,服务器就需要启动一个线程进行处理,如果这个连接不做任何事情,就会造成不必要的开销。当前也可以通过线程池机制来改善。
NIO:同步并非阻塞,在服务器实现的模式为一个请求一个线程,客户端发送的请求都会注册到多路复用器上,多路复用器轮询有连接IO请求操作才会启动一个线程进行处理,NIO一般适用于连接数剧目比较多,连接毕竟短的架构
AIO异步并非阻塞,在服务器实现模式为一个有限有效请求一个线程,当客户端的IO请求都是通过操作系统先完成之后,在通知服务器去启动线程进行处理。一般适用于连接数目比较多,连接比较长的架构。
总结
IO操作