1.Java I/O的基本架构
1.1Java的I/O操作类在包java.io下,大概有80个类,大概分为以下四组
基于字节操作的I/O接口:InputStream和OutputStream
基于字符操作的I/O接口:Writer和Reader
基于磁盘操作的I/O接口:File
基于网络操作的I/O接口:Socket
Socket接口不在java.io包下
前两组主要是传输数据的数据格式
后两组主要是传输数据的方式
1.2基于字节的I/O操作接口
1.3 基于字符的I/O操作接口
1.5 字节与字符的转化接口
2.磁盘I/O工作机制
标准访问方式
直接I/O访问
同步访问
异步访问
内核空间/用户空间
为了保护系统本身的运行安全将内核程序云心使用的内存空间和用户程序运行的内存空间进行了隔离
2.1 标准访问方式
读:调用read()接口,内核空间高速缓存中有要读取的内容时直接读取。没有去磁盘读取,将读取的内容缓存到内核空间。
写:调用write()接口,将数据从用户空间写入到内核空间中,则写入成功。内核空间写入到磁盘则有操作系统决定。除非显示调用sync同步命令。
2.2 直接I/O方式
用户程序直接访问磁盘数据,而不经过操作系统内核数据缓冲区。
2.3 同步访问文件方式
数据的写入和读取都是同步操作的。只有数据成功写入到磁盘后才会返回成功标志。
性能较差,只有安全性要求比较高时才使用。
2.4 异步访问文件方式
当访问数据的线程发出请求之后,线程会去处理其它的事情,而不是阻塞等待,当请求的数据返回后继续处理下面的操作。
2.5 内存映射方式
操作系统将内存中的某一块区域与磁盘中的文件关联起来,当访问内存中的数据时转化为访问文件的某一段数据。
3.Java访问磁盘文件
数据在磁盘中的唯一最小描述是文件。
文件也是操作系统和磁盘驱动器交互的最小单元。
4.网络I/O工作机制
将一份数据从一个地方正确的传输到另一个地方所需要的时间称之为响应时间。
影响响应时间的因素:
网络宽带
传输距离
TCP拥塞控制
RAID
RAID 0:数据被平均写到多个磁盘中,并发读写
RAID 1:数据被写入到多个磁盘中,数据安全
RAID 5:数据被写入到n-1个磁盘中,最后一个磁盘写入数据的奇偶校验码。通过奇偶校验码可以恢复损坏的磁盘数据
RAID 0+1:一份数据写入到多个磁盘。同时一份数据平均写到多个磁盘
提升I/O性能
增加缓存,减少磁盘访问次数
优化磁盘的管理系统,设计最优的磁盘方式策略,以及磁盘寻址策略。
设计合理的磁盘存储数据块,以及访问这些数据块的策略。
应用合理的RAID策略,提升网络I/O,
网络I/O优化
减少网络交互次数
在进行网络交互的两端设置缓存
合并访问请求
减少网络传输数据量的大小
将数据压缩后在进行传输
尽量减少编码
网路I/O的数据是通过字节进行传输的,当传输字符时,就需要进行字符到字节的编码。这个编码比较耗时
所以,可以在传输之前就将字符转换为字节,或者直接传输字节
同步异步:
同步:任务A调用任务B时,任务A必须等待任务B执行结束再执行
异步:任务A调用任务B时,任务A不用等待任务B执行结束后才执行
阻塞非阻塞
阻塞:当一个操作非常耗时时,CPU空闲下来等待操作完成在进行下面的执行
非阻塞:当一个任务非常耗时时,CPU的使用权有其它线程使用。等这个耗时操作完成后,在获取CPU的使用权限进行下面的执行。
CPU的使用率提高了,但增加了线程的切换
适配器模式
将已有的类A放入到实现或继承了类B的类C中,以此让A中的方法methodA能够实现类B需要的功能
装饰器
将已有的类A放入到类B中,并在类B中添加相关的方法,在通过类B调用类A的相关方法时,通过类B的一些功能对类A的方法进行增强