Java IO 架构
程序员文章站
2022-03-22 10:13:37
...
主要两类:
磁盘I/O
网络I/O
基于字节操作的I/O接口:InputStream和OutputStream
基于字符操作的I/O接口:Writer和Reader
基于磁盘操作的I/O接口:File
基于网络操作的I/O接口:Socket
字符解码相关类结构:
字符编码相关类结构:
Java序列化就是将一个对象转化成一串二进制表示的字节数组,通过保存或转移这些字节数据来达到持久化的目的。
需要序列化,对象必须继承java.io.Serializable接口。
Socket通信示例:
Java NIO 相关类图:
基于NIO的Socket请求处理过程:
Java I/O 工作机制:
读取和写入文件I/O操作都通用操作系统提供的接口,因为磁盘设备是由操作系统管理的,应用程序要访问物理设备只能通过系统调用的方式来工作。读和写分别对应read()和write()两个系统调用。而只要是系统调用就可能存在内核空间地址和用户空间地址切换的文件,这是操作系统为了保护系统本身的运行安全,而将内核程序运行使用的内存空间和用户程序运行的内存空间进行隔离造成的。但是这样虽然保证了内核程序运行的安全性,但是也必然存在数据可能需要从内核空间向用户空间复制的问题。
操作系统为了加速I/O的访问,在内核空间使用缓存机制,也就是将从磁盘读取的文件按照一定的组织方式进行缓存,如果用户程序访问的是同一段磁盘地址的空间数据,那么操作系统将从内核缓存中直接取出返回给用户程序,这样可以减少I/O的响应时间。
标准访问文件的方式:
当应用程序调用read()接口时,操作系统检查在内核的高速缓存中有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回,如果没有,则从磁盘中读取,然后缓存再操作系统的缓存中。
当应用程序调用write()接口时,将数据从用户地址空间复制到内核地址空间的缓存中。这事对用户程序来说写操作就已经完成,至于什么时候再写到磁盘中由操作系统决定,除非显式地调用了sync同步命令。
提升磁盘I/O性能的方法:
1)增加缓存,减少磁盘访问次数
2)设计合理的磁盘存储数据块,以及访问这些数据块的策略
提升网络I/O性能的方法:
1)减少网络交互
2)减少网络传输数据量的大小
3)尽量减少编码
Java序列化:
Java序列化就是将一个对象转化成一串二进制表示的字节数组,通过保存或转移这些字节数据来达到持久化的目的。需要持久化,对象必须继承java.io.Serializable接口。
反序列化则是相反的过程,将这个字节数据再重新构造成对象。
(1)当父类继承了Serializable接口时,所有子类都可以被序列化。
(2)子类实现了Serializable接口,父类没有,父类中的属性不能被序列化(不报错,数据会丢失),但是在子类中的属性仍能正确序列化。
(3)如果序列化的属性是对象,则这个对象也应该实现Serializable接口,否则会报错。
(4)在反序列化时,如果对象的属性有修改或删减,则修改的部分属性会丢失,但不会报错。
(5)在反序列化时,如果serialVersionUID被修改,则反序列化时会失败。
磁盘I/O
网络I/O
基于字节操作的I/O接口:InputStream和OutputStream
基于字符操作的I/O接口:Writer和Reader
基于磁盘操作的I/O接口:File
基于网络操作的I/O接口:Socket
字符解码相关类结构:
字符编码相关类结构:
Java序列化就是将一个对象转化成一串二进制表示的字节数组,通过保存或转移这些字节数据来达到持久化的目的。
需要序列化,对象必须继承java.io.Serializable接口。
Socket通信示例:
Java NIO 相关类图:
基于NIO的Socket请求处理过程:
Java I/O 工作机制:
读取和写入文件I/O操作都通用操作系统提供的接口,因为磁盘设备是由操作系统管理的,应用程序要访问物理设备只能通过系统调用的方式来工作。读和写分别对应read()和write()两个系统调用。而只要是系统调用就可能存在内核空间地址和用户空间地址切换的文件,这是操作系统为了保护系统本身的运行安全,而将内核程序运行使用的内存空间和用户程序运行的内存空间进行隔离造成的。但是这样虽然保证了内核程序运行的安全性,但是也必然存在数据可能需要从内核空间向用户空间复制的问题。
操作系统为了加速I/O的访问,在内核空间使用缓存机制,也就是将从磁盘读取的文件按照一定的组织方式进行缓存,如果用户程序访问的是同一段磁盘地址的空间数据,那么操作系统将从内核缓存中直接取出返回给用户程序,这样可以减少I/O的响应时间。
标准访问文件的方式:
当应用程序调用read()接口时,操作系统检查在内核的高速缓存中有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回,如果没有,则从磁盘中读取,然后缓存再操作系统的缓存中。
当应用程序调用write()接口时,将数据从用户地址空间复制到内核地址空间的缓存中。这事对用户程序来说写操作就已经完成,至于什么时候再写到磁盘中由操作系统决定,除非显式地调用了sync同步命令。
提升磁盘I/O性能的方法:
1)增加缓存,减少磁盘访问次数
2)设计合理的磁盘存储数据块,以及访问这些数据块的策略
提升网络I/O性能的方法:
1)减少网络交互
2)减少网络传输数据量的大小
3)尽量减少编码
Java序列化:
Java序列化就是将一个对象转化成一串二进制表示的字节数组,通过保存或转移这些字节数据来达到持久化的目的。需要持久化,对象必须继承java.io.Serializable接口。
反序列化则是相反的过程,将这个字节数据再重新构造成对象。
(1)当父类继承了Serializable接口时,所有子类都可以被序列化。
(2)子类实现了Serializable接口,父类没有,父类中的属性不能被序列化(不报错,数据会丢失),但是在子类中的属性仍能正确序列化。
(3)如果序列化的属性是对象,则这个对象也应该实现Serializable接口,否则会报错。
(4)在反序列化时,如果对象的属性有修改或删减,则修改的部分属性会丢失,但不会报错。
(5)在反序列化时,如果serialVersionUID被修改,则反序列化时会失败。
下一篇: php扩展Imagick