IO面试题
上级目录

IO面试题

一.1 IO

一.1.1 123

1、BIO,NIO,AIO的区别?2、什么是阻塞IO以及非阻塞IO? 3、什么是同步IO以及异步IO? 4、IO模型有几种?分别是什么? 5、Reactor和Proactor IO设计模式是什么?6、NIO底层select、poll和epoll实现的区别 ?7、Java NIO的几个核心组成部分是什么?作用分别是什么?8、Redis、Netty、Tomcat的线程模型与NIO的联系是什么?

通信框架

流行基于JavaNIO通信框架有Mina、Netty、Grizzly等。接下来说下它们之间的对比。

它们的出身

Mina出身于开源界的大牛Apache组织;

Netty出身于商业开源大亨Jboss;

Grizzly则出身于土鳖Sun公司。

它们的设计理念

1、Mina

Mina(MultipurposeInfrastructureforNetworkApplications)是Apache组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的Mina版本2.04支持基于JavaNIO技术的TCP/UDP应用程序开发、串口通讯程序,Mina所支持的功能也在进一步的扩展中。

目前,正在使用Mina的应用包括:ApacheDirectoryProject、AsyncWeb、AMQP(AdvancedMessageQueuingProtocol)、RED5Server(MacromediaFlashMediaRTMP)、ObjectRADIUS、Openfire等等。

2、Netty

Netty是一款异步的事件驱动的网络应用框架和工具,用于快速开发可维护的高性能、高扩展性协议服务器和客户端。也就是说,Netty是一个NIO客户端/服务器框架,支持快速、简单地开发网络应用,如协议服务器和客户端。它极大简化了网络编程,如TCP和UDP套接字服务器。

3、Grizzly

Grizzly是一种应用程序框架,专门解决编写成千上万用户访问服务器时候产生的各种问题。使用JAVANIO作为基础,并隐藏其编程的复杂性。容易使用的高性能的API。带来非阻塞socket到协议处理层。利用高性能的缓冲和缓冲管理使用高性能的线程池。

从设计的理念上来看,Mina的设计理念是最为优雅的。当然,由于Netty的主导作者与Mina的主导作者是同一人,出自同一人之手的Netty在设计理念上与Mina基本上是一致的。而Grizzly在设计理念上就较差了点,几乎是JavaNIO的简单封装。

Netty为什么这么火?

Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

相比JDK原生NIO,Netty提供了相对十分简单易用的API,非常适合网络编程。Netty是完全基于NIO实现的,所以Netty是异步的。

作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。

Netty无疑是NIO的老大,它的健壮性、功能、性能、可定制性和可扩展性在同类框架都是首屈一指的。它已经得到成百上千的商业/商用项目验证,如Hadoop的RPC框架Avro、RocketMQ以及主流的分布式通信框架Dubbo等等。

为什么这么火,是有原因的。

Netty的优点可以总结如下:

API使用简单,开发门槛低;

功能强大,预置了多种编解码功能,支持多种主流协议;

定制能力强,可以通过ChannelHandler对通信框架进行灵活地扩展;

性能高,通过与其他业界主流的NIO框架对比,Netty的综合性能最优;

成熟、稳定,Netty修复了已经发现的所有JDKNIOBUG,业务开发人员不需要再为NIO的BUG而烦恼;

社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会加入;

经历了大规模的商业应用考验,质量得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它已经完全能够满足不同行业的商业应用了。

一.1.1.6 与Mina相比有什么优势:

都是TrustinLee的作品,Netty更晚;

Mina将内核和一些特性的联系过于紧密,使得用户在不需要这些特性的时候无法脱离,相比下性能会有所下降,Netty解决了这个设计问题;

Netty的文档更清晰,很多Mina的特性在Netty里都有;

Netty更新周期更短,新版本的发布比较快;

它们的架构差别不大,Mina靠apache生存,而Netty靠jboss,和jboss的结合度非常高,Netty有对googleprotocalbuf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);

Netty比Mina使用起来更简单,Netty里你可以自定义的处理upstreamevents或/和downstreamevents,可以使用decoder和encoder来解码和编码发送内容;

Netty和Mina在处理UDP时有一些不同,Netty将UDP无连接的特性暴露出来;而Mina对UDP进行了高级层次的抽象,可以把UDP当成"面向连接"的协议,而要Netty做到这一点比较困难。

从任务调度粒度上看,mina会将有IO任务的session写入队列中,当循环执行任务时,则会轮询所有的session,并依次把session中的所有任务取出来运行。这样粗粒度的调度是不公平调度,会导致某些请求的延迟很高。

什么是流每种方式又将流各分为哪几类?

Java中的流是个抽象的概念,当程序需要从某个数据源读入数据的时候,就会开启一个数据流,数据源可以是文件、内存或网络等等。相反地,需要写出数据到某个数据源目的地的时候,也会开启一个数据流,这个数据源目的地也可以是文件、内存或网络等等

Java中的流可以从不同的角度进行分类:

按照流的方向不同:分为输入流和输出流。

按照处理数据单位的不同:分为字节流(8位)和字符流(16位)。

按照功能不同:分为节点流和处理流。

节点流:是可以从一个特定的数据源(节点)读写数据的流(例如文件,内存)。就像是一条单一的管子接到水龙头上开始放水。

处理流:是“连接”在已经存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。就像在已经接了一条管子(节点流)的基础上,又套上几个更粗,具有特殊功能的管子(处理流)对流出的水进一步的处理。

四种基本流InputStream,OutputStream,Reader,Writer又分别有更具体的子类,分为文件流,缓冲流,数据流,转换流,Print流,Object流等,都分别有特定的功能或用来操作特定的数据

https://www.cnblogs.com/qiuh/archive/2013/11/06/3411197.html

字节流和字符流的区别

字节流按8位传输以字节为单位输入输出数据。

字符流按16位传输,以字符为单位输入输出数据。

nio是什么,是哪个版本开始有的?

IO:面向流单向的面向缓冲区:通道可以是单双向的

阻塞IO

NIO:面向缓冲区(BufferOriented):通道可以是单向的,也可以是双向的

非阻塞IO(NonBlockingIO)

选择器(Selectors)

JavaNIO(NewIO,Non-BlockingIO)是从Java1.4版本开始引入的一套新的IOAPI,可以替代标准的JavaIOAPI。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。Non-Blocking应该是最好的理解

随着JDK7的发布,Java对NIO进行了极大的扩展,增强了对文件处理和文件系统特性的支持,以至于我们称他们为NIO.2。因为NIO提供的一些功能,NIO已经成为文件处理中越来越重要的部分。

java里面的io跟nio有什么区别

1、JavaNIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。

2、JavaIO的各种流是阻塞的。而JavaNIO的非阻塞模式,使一个线程从某通道发送请求读取数据,

但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。

3、选择器上,JavaIO无选择器,而NIO有选择器,JavaNIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。

io流分几种

按功能来说:输入流和输出流。

按类型来说:字节流和字符流。

BIOAIONIO区别

BIO:blockio同步阻塞式,就是我们通常说的传统io,模式简单使用方便,并发处理低。

NIO:newIo同步非阻塞。传统IO的升级。客户端和服务器通过channel通道通讯,实现了多路复用。

AIO:AsynchronousIO是NIO的升级,实现了异步非阻塞IO,异步IO的操作基于事件和回调机制。

aio是什么?了解过吗?是哪个版本开始有的?与nio的区别知道吗?

Files的常用方法都有哪些?

Files.exists():检测文件路径是否存在。

Files.createFile():创建文件。

Files.createDirectory():创建文件夹。

Files.delete():删除一个文件或目录。

Files.copy():复制文件。

Files.move():移动文件。

Files.size():查看文件个数。

Files.read():读取文件。

Files.write():写入文件。

 

本文原创,商业转载请联系作者获得授权,非商业转载请注明出处。

评论

发送评论 编辑评论


                        

后端技术分类热门文章

标签热门文章排行

☛免责声明 ☛本站使用教程
Theme Argon With Ry-Plus By 清欢
我的第15506位朋友,历经86951次回眸才与你相遇