什么是I/O流呢?
input、output输入和输出,而‘流’是一种抽象的概念,表示的是数据的五结构化传递。
核心体系
File、InputStream、OutputStream、Reader、Wirter
IO流的分类
字节输入InputStream、输出流OutputStrream:可以处理所有的文件
字符输入Reader、输出流Writer:只可以处理字符文件
IO来源
- 磁盘I/O.
//磁盘IO FileInputStream fis=new FileInputStream("D:/text.txt");
- 内存
//内存 String str="hello word"; ByteArrayInputStream bai=new ByteArrayInputStream(str.getBytes());
-
键盘
//键盘 //Scanner InputStream is=System.in;
序列化、反序列化 (实现对象跨JVM传输)
ObjectInputStream/ObjectOutputStream
I/O流的底层原理
什么是RPC协议(技术下沉)
RPC(Remote Procedure Call)远程过程调用,是通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。一般用来实现部署在不同机器上的系统方法的调用,通过网络传输使程序能够像访问本地资源一样访问远端系统资源。
五种I/O模型
阻塞
非阻塞——轮询,增加CPU资源压力
复用——
select/poll:单个进程可以同时处理多个客户端的网络IO连接,缺点:会扫描所有的连接,造成系统开销、响应延时,jdk1.6前的NIO使用的是这种模型。
epoll:对单个进程打开的连接数没有限制(根据内存);利用每个fd上的callback函数来实现异步回调,省去了轮询;
异步I/O
信号驱动
BIO:通过多线程优化,一个线程负责一个IO流的操作
NIO:new IO,新特性如下图
NIO中的核心组件
通道(Channel):Java NIO数据来源,可以是网络也可以是本地磁盘
缓冲区(Buffer):数据读写的中转区
选择器(Selectors):异步IO的核心类,实现异步非阻塞IO一个Selectors可以管理多个通道
Channel通道的实现:
FileChannel:从文件中读写数据
DatagramChannel:通过TCP协议读写网络中的数据
ServerSocketChannel:监听一个TCP连接,对于每个新的客户端连接都会创建一个SocketChannel
Buffer的本质