Java-IO
IO模型
读写原理
-
读和写并不是内存和物理设备直接操作, 而是需要通过两步
-
内核线程缓存区和物理设备
- 操作系统内核(如Kernel)完成
-
内核线程缓存区和用户线程缓存区
- read : 内核缓存区复制到用户线程区
- write: 用户线程缓存区复制到内核缓存区
-
-
这么设计的目的
-
减少系统中断, 提升性能
- 大家都知道,外部设备的直接读写,涉及操作系统的中断。发生系统中断时,需要保存之前的进程数据和状态等信息,而结束中断之后,还需要恢复之前的进程数据和状态等信息。为了减少这种底层系统的时间损耗、性能损耗,于是出现了内存缓冲区。
- 底层操作会对内核缓冲区进行监控,等待缓冲区达到一定数量的时候,再进行IO设备的中断处理,集中执行物理设备的实际IO操作,这种机制提升了系统的性能
-
同步异步, 阻塞非阻塞
-
同步异步
- 同步异步是指服务端(或内核)是否主动发送状态到客户端(或用户线程)
- 客户端需要不断的去请求服务端获取最终结果, 属于同步CAS
- 异步, 客户端不需要多次访问服务端, 服务端如果准备处理好了, 会告诉客户端
-
阻塞非阻塞
- 阻塞非阻塞是指客户端(或用户线程)的操作是否是可以进行其他操作, 还是只能等待
四种模型
-
BIO
-
同步阻塞IO
-
Java传统的IO就是这种
-
读操作图
-
-
-
具体应用
-
JAVA-IO-字节字符流
- Java字节字符流.html
-
网络流
-
Socket
-
ServerSocket
-
demo
- BIOClientTest.java
- BIOServer.java
- BIOServerMuilt.java
- 客户端的Socket和服务端用ServerSocket.accept() 得到的Socket其实是一个实例
-
-
-
-
NIO
-
同步非阻塞IO
-
注意并不是java中的NIO
-
读示例
-
-
很少直接使用
-
-
-
IO多路复用
-
异步阻塞IO
-
具体应用
-
Java-NIO
-
3大元素
-
Channel
-
一个Channel可以理解为一个通道, 类比BIO的socket。 可以得到输入,也可以得到输出
-
常用子类
-
FileChannel
- 文件通道, 是阻塞式的. 不能绑定到Selector
-
SocketChannel
-
TCP连接的客户端和服务器端都会用到
-
创建
- open()
- ServerSocketChannel.accept()//服务器端创建
- SelectionKey.channel()
-
其他方法
-
connect
-
-
-
-
-
-
-
-