java操作IO
java操作IO的类 大抵可以用两个维度来分类。
操作类型
- 字节操作的 InputStream 和OutputStream
- 字符操作的:Writer 和Reader
操作的对象的类型
- 磁盘的:File
- 网络的:Socket
基本都在IO的里面了,而Socket实际上主要还是使用流来做处理。
这里面需要注意的是一个叫StreamDecoder的东西
这其实就是InputStream和Reader的最大区别。
同理 StreamEncoder
磁盘I/O工作机制
访问文件的几种方式
- 标准访问文件的方式 物理磁盘--内核空间--用户空间
- 直接I/O 物理磁盘--用户空间 多用于数据库
- 内存映射, 物理磁盘--(用户空间/内核空间) 用户空间和内核空间建立共享关系
- 同步访问文件方式 数据安全比较高才会使用
- 异步访问文件方式 正常情况都会这么干,能提高应用程序的效率,但不会改变访问文件的效率
java序列化
其实就是根据一定的规则,将字符串变成一长串的byte数组。比较有意思的一点是这样
- 父类集成Serializable接口,所有子类都可以被序列化
- 子类实现了Serializable接口,父类没有,则父类中的属性不能序列化,子类中的属性能正确序列化。
- 对象A有个属性是对象B,则对象B也必须实现Serializable 否则报错
- 反序列化的对象如果有删除或者修改。不会报错,但是会丢失修改的属性数据。
- 反序列化,如果serialVersionUID被修改,则反序列化时会失败。
如果是JAVA之间的通信,我们用Serializable即可,但是其他语种是不认识的。所以尽量还是使用JSON或者XML这种通用的格式来序列化。
网络IO
tcp状态转化
以及状态机