Java 的I/O类库的基本结构
基于字节操作的I/O接口:inputStream和OutputStream
基于字符操作的I/O接口:Writer和Reader
基于磁盘操作的I/O接口:File
基于网络操作的I/O接口:Socket
前两组主要是传输数据的数据个数,后两组主要是传输数据的方式。
不管是磁盘和网络传输,最小的存储单元都是字节
标准访问文件方式
访问文件:调用read()接口, 操作系统检查在内核的高速缓存中有没有需要的数据,如果已经缓存,返回,没有则从磁盘中读取,然后缓存在操作系统的缓存中。
写入文件:write()接口,将数据从用户空间复制到内核地址空间的缓存中。完成
什么时候写入磁盘由操作系统决定,除非显式调用sync同步命令。
直接I/O的方式
应用程序直接访问磁盘数据,而不经过操作系统内核数据缓冲区。目的:减少数据从内核空间缓存到用户空间缓存的数据复制操作
同步访问文件方式
数据的读取和写入都是同步操作的。
异步访问文件的方式
当访问数据的线程发出请求之后,线程会接着去处理其他事情
内存映射的方式
操作系统将内存中的某一块区域与磁盘中的文件关联起来,当要访问内存中的数据时,转换为访问文件中的数据。 目的:减少数据从内核空间缓存到用户空间缓存的数据复制操作
Java序列化技术
Java序列化就是将一个对象转化成一串二进制表示的字节数组,通过保存或转移这些字节数据来达到持久化的目的。
反序列化则是将这个字节数组再重新构造成对象,但必须
有原始类作为模板,才能还原。
总结:
1. 当父类基础Serializable接口时,所有子类都可以被序列化。
2. 子类实现了Serializable接口,父类没有,父类的属性不能被序列化,
但是在子类中属性仍能正确序列化。
3. 如果序列化的属性是对象,则这个对象也必须实现Serializable接口,否则会报错。
4. 在反序列化时,如果对象的属性有修改或删减,则修改的部分属性会丢失,但不会报错。
5. 在反序列化时,如果serialVersionUID被修改,则反序列化时会失败
6. 在多语言环境下,还是要尽量存储通用的数据结构,如JSON或者XML结构数据。
影响网络传输的因素
网络带宽:一条物理链路在1s内能够传输的最大比特数,b/s
传输距离:数据在光纤中要走的距离
TCP拥塞控制
Socket描述计算机之间完成相互通信的一种抽象功能
NIO
NIO关键类:Channel和Selector
Channel比作交通工具
Selector比作运行调度系统,负责监控
网络I/O优化
- 减少网络交互的次数
- 减少网络传输数据量的大小:将数据压缩后再传输
- 尽量减少编码: 因数据都是字符 需要转字节
同步与异步:
同步:一个任务的完成