Java面试IO篇(四)

IO中的流分为几种?

按照流的流向分:可以分为输入流和输出流;

按照流的单元划分:可以分为字节流和字符流;

按照流的角色划分:可以分为处理流和节点流。

JavaIO流设计40多个类,看起来非常杂乱,实则非常规则,类与类之间有极强的联系,JavaIO流的这40个类基本都时由以下四个抽象类基类派生出来的。

InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流;

OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流;

BIO、NIO、AIO有什么区别?

了解如下知识:

同步与异步:

同步:同步就是发起一个调用后,被调用者未完成请求之前,调用不反回。

异步:异步就是发起一个调用后,被调用者立即回应已接受到请求,但是被调用者没有立即返回结果,此时我们可以处理其他请求,被调用者通常依靠事件、回调等机制来通知调用者其返回结果。

同步和异步最大的区别就是,异步不需要调用者等待处理结果,被调用者会通过回调等机制通知调用者返回结果。

阻塞与非阻塞:

阻塞:发起一个请求,调用者一直等待结果返回,也就是当前线程被挂起,无法从事其他任务,只有满足条件才能继续往下运行。

非阻塞:发起一个请求,调用者可以不用等待结果返回,可以去做其他事。

Linux的五种IO模型:

阻塞IO模型:拿钓鱼举例,阻塞IO在钓鱼中是最惬意的一种,什么也不干,直到鱼咬钩。

非阻塞IO模型:非阻塞IO类似于边钓鱼边玩手机,玩手机的同时不断的看鱼有没有上钩。

IO复用模型:IO复用类似于同时有很多根鱼竿,在这个过程中不断的看每个鱼竿有没有鱼上钩。

信号驱动IO模型:信号驱动IO类似于有报警器的鱼竿,在这过程中可以做别的事情,鱼咬钩就报警。(以上四种IO模型都属于同步IO模型,因为最后鱼咬钩都是需要人把他放到水桶里,也就是操作系统拷贝信息的过程)

异步IO模型:相当于是一个全自动的钓鱼竿,鱼咬钩后自动收到水桶里,通知鱼已经钓到了,然后又去钓下一条鱼。这种方式钓鱼无疑是最省事的。映射到Linux操作系统中,应用进程把IO传给内核后,完全由内核去操作文件拷贝。内核完成相关操作后,会发信号告诉应用进程本次IO已完成。

Java IO 方式有很多种,基于不同的 IO 抽象模型和交互方式,可以进行简单区分。

BIO(Blocking I/O):同步阻塞IO模式,数据的读写必须阻塞在一个线程内完成。

传统的BIO通信采用的是一问一答形式,它基于流模型实现,一个请求一个线程,客户端有请求时,服务端就要启一个线程来处理请求,线程开销大。伪异步IO:将请求连接放到线程池,但是线程还是很宝贵的资源,它处理并发能力低,无法从根本上解决高并发的问题。

NIO(Non Blocking I/O):同步非阻塞IO模式

NIO是传统IO的升级,提供了channel、seletor、Buffer等新的抽象,客户端和服务端通过channel(通道)通讯,实现了多路复用,客户端发送的请求都会注册到多路复用器上,多路复用器轮询连接有I/O请求时才启动一个线程处理该请求。NIO利用了单线程轮询机制,通过高效的定位就绪的channel,有效的避免了大量客户同时访问带来的问题,应用的扩展能力有了很大的提高。

AIO(jdk1.7后又叫NIO 2)异步非阻塞IO模式 Asynchronous I/O

异步IO的操作是基于事件和回调机制,性能是最好的。底层实现是通过epoll的I/O多路复用机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值