你是如何理解io流的
文件通常由一连串特定的字节或字符组成的,组成文件的字节序列叫做字节流,组成文件的字符序列叫做字符流
Java根据方向上可以分为输入流和输出流
输入流是将文件,或其他输入设备添加到内存中的过程
输出流恰恰相反,是将内存中数据保存到文件或其他输出设备中
工作中是如何使用io操作的
io操作从方向上可以分为输入流输出流,从单位上可以分为字节流和字符流
字节流可以通过StreamReader将字节流转换为字符流提高效率,为了提高效率还会用到buffer缓存流
工作中你用到哪些流
文件是由字符或字节组成的
输入流和输出流他们由分为字节输入输出流, 字符输入输出流
IO有哪些类型
常用的io操作基本都是BIO 项目中实际用到io操作的环境并不多,但是我了解到很多分布式框架底层使用的都是Nio,NIO的底层是Buffer缓存流Chanel(通道)和Selector(多路复用)
BIO通信模型
BIO为同步阻塞,服务器实现为一个链接一个线程,即客户端有链接请求时服务端就需要一个线程处理
BIO有哪些实现方式
传统BIO:
采用BIo通信模型的服务器,通常由一个独立的Alleptor线程监听客户端的链接,无客户端即阻塞,可以采用多线程的方式来支持多个客户端的链接,缺点是线程开销量大 如何改进?可以用伪异步BIO来改进,为了解决同步阻塞BIO面临的一个线程链路对应一个线程处理的问题
后端会通过线程池来处理多个客户端的请求接入,形成客户端个数M,线程池的最大线程数N呈比例关系,其中M可以远大于N
NIO通信模型
BNIO是一个同步非阻塞线程模型,一个线程处理多个请求链接,Dubbo的底层就是采用的NIO实现的,一个线程包含Selector,Chame和Buffer组成的
AIO通信模型
AIO异步非阻塞模型,AIO引入异步概念,采用Proactor模式,简化程序编写,有效的请求与才启动线程
NIO的buffer由哪些重要的属性
Capacitty:容量,即可以容纳的组最大数据量,在缓冲区创建时被设定的值不能被改变
linit:表示缓存区当前终点,不能对缓冲区超过极限的位置进行读写操作,且极限是可以修改的
position: 位置喜爱个要被读写元素的索引每次读写缓冲区数据时都会发生改变,为下一次读写做准备
Mark: 标记
Nio中你使用过哪些Channel
FileChannel: 主要对本地文件进行io操作
DatagramChannel:主要对UDP数据读写
SocketChannel:用于tcp数据读写客户端实现
ServerSocketChannel:用于tcp数据读写,客户端实现
NIO的Channel和流有什么区别
Channel是双向的,可读,可写,流是单向的
Channel可以进行异步读写
Channel是基于Buffer操作
NIO的Selector
selector是选择器,是java中能够检测多个NIO通道并能知道是否为诸如读写做好准备的组件,这样单独的线程可以管理多个Channel,从而管理多个逻辑链接
Selector是抽象的他的主要的一个实现类是selectorImpl
常用方法有:
select(long TimeOut)阻塞选择器,timeOut为阻塞时间,如果没有就是一直阻塞类似于sleep方法
selectkey() 从Set集合中得到所有的SelectKey