深入分析java的i/o机制
java I/O 的基本架构:
1:基于字节操作的I/O接口 InputStream OutputStream
2:基于字符操作的I/O接口 Writer 和Reader
3:基于磁盘操作的I/O接口 File
4:基于网络操作的I/O接口 Socket
12为数据传输的格式
34为数据传输的方式
123位于java.io包中其中包含了大概80个类
对于1:基于字节·InputStream OutputStream。
1:操作数据的方式可以组合使用;
2:必须指定流文件写到网络中还是磁盘中;
对于2:基于字符 ·Write Reader
1:之规定了字符读写的方式
2:实现的函数:write (char cb-uf[], int off ,int len);
reader(char cbuf[], int off, int ;len );
对于12,字符字节之间的转化
1:字节转字符 InputStreamReeader()
2: 字符转字节 OutputStreamWriter()
对于三:磁盘I/O工作机制
访问文件包含的空间:
1:磁盘
2:内核空间
3:用户空间
4: 缓存
工作流程:应用程序访问磁盘空间,需要经过系统的write 和 read 调用来;系统为了安全,会将内核程序和用户程序之间隔离从而产生内核空间和用户空间;
1:标准访问文件的方式:
读取:read接口先在内核空间中搜索,没有则从磁盘中读取;
写入:write接口将数据从用户复制到内核,写磁盘是异步的,除非调用sync同步命令;
2:直接I/O方式:
读写都是直接通过用户空间的缓存来进行,可以做到预加载了,提高访问速度,如果访问的数据没有在应用程序缓存中,将会很慢;
3: 同步访问文件的方式:
性能较差,只用当文件全部读写完成,才会返回给应用程序成功的标志;
4:异步访问文件的方式:
发出处理文件的线程之后,不会出现阻塞等待,提高了应用程序的效率,文件读写的效率并没有提高;
5:内存映射的方式:
将内存中的某一区域和磁盘中的文件关联起来,访问内存中的一段数据时,转换为访问文件的数据,减少从内核空间缓存到用户空间缓存的数据复制操作;
java序列化技术:继承java.io.Serializable接口;将一个对象转化成一串二进制表示的字节数组,通过保存或传义这些字节数据来达到持久化的目的。
序列化情况的总结:1:父类继承Serializable接口,子类都可以被序列化
2:子列实现了Seriializable接口,父类没有,父类中的属性不能序列化,单子类中属性仍能正确序列化。
3:序列化的属性是对象,对象必须实现Serializable接口;
4:反序列化,如果对象的属性有修改或者删减,则修改的部分属性会丢失,但不会报错;
5:反序列化时,如果serialVersionUID被修改,反序列化会失败;
四:网络I/O的工作机制;
TCP的是一种状态:TCP的11种状态:
1:CLOSED :起始点,在连接关闭或超时的时候变成此状态
2:LISTEN : 监听来自网络节点上其他主机的TCP端口连接请求,服务端需要调用socket, bind,listen函数,就进入此状态。此称为应用程序被动打开(等待客户端来连接)
3:SYN_RCVD :服务器接收到来自客户端的连接请求(发送一个SYN分节),服务器端tcp状态就由LISTEN- > SYN_4:RCVD,服务器端发送ACK和SYN,或者客户端在发起SYN的同时接收到服务器端的SYN,客户端就会SYN_SENT -> SYN_RCVD。
5:SYN_SETN:客户端发起连接,发送SYN给服务器端。如果服务器端不能连接(应用关闭;或超时),则直接进入CLOSED状态。具体行为是发起一个SYN连接请求
6:ESTABLISHED:总体说来,客户端和服务器端在完成三路握手后,两者最终进入的状态,表示连接已经建立成功,可以传送数据了。对于服务器端来说,就是在SYN_RCVD状态时,收到了来自客户端的ACK。于是SYN_RCVD->ESTA7:BLISHED;对于客户端来说,就是在SYN_SENT状态时,收到了来自服务器端的SYN+ACK分节,状态从SYN_SENT->ESTABLISHED,然后发送ACK
8:FIN_WAIT_1:主动关闭的一方(发送FIN的那方)从ESTABLISHED -> FIN_WAIT_1
9:FIN_WAIT_2:主动关闭的一方,接收到对方的FIN ACK,进入此状态。由此不能再接收对方的数据。但是能够向对方发送数据(此句话很重要)
10:PCLOSE_WAIT:接收到FIN以后,被动关闭的一方进入此状态。具体动作时接收到FIN,同时发送ACK。为了便于记忆,大家可以这么想,TCP终止中,接收到了FIN的被动关闭方发送ACK后,过会还要发送FIN表示自己也要关闭了,中间的这段就可以叫做CLOSE_WAIT(等待关闭)
LAST_ACK:,被动方发送FIN,导致CLOSE_WAIT -> LAST_ACK,TCP终止则还需要等待最后一个ACK,所以状态叫做LAST_ACK,等到最后ACK后,LAST_ACK ->CLOSED
11: CLOSING:主动关闭方处于FIN_WAIT_1状态时,接收FIN,则从FIN_WAIT_1 -> CLOSING
影响网络传输的因素:网络带宽,传输距离,TCP拥塞控制
建立通信链路Socket:位于TCP/UDP之上,包含本机地址,远程地址,端口套接字,经历完TCP三次握手协议,之后建立;
网络数据传输时,两端同时发送数据,会出现死锁,通过NIO工作机制,可以避免。NIO机制通过引入:Channel Buffer Selector 来处理解决;
设计模式解析之适配器模式:
Tareget(目标接口):所要转换的所期待的接口;
Adaptee(源角色):需要适配的接口;
Adapter(适配器):将源接口是配成目标接口,继承源接口,实现目标接口;
设计模式解析之装饰器模式:
Component:定义抽象接口,规定被装饰组件的功能;
ConcreteComponent:实现抽象组件的所有功能;
Decorator:装饰器角色