【Java超高频面试题&IO流】IO流相关高频面试题汇总

简介:

本期文章将汇总javaIO流结构相关的高频面试题,给最近需要找工作的朋友们总结一波,帮助大家全面掌握IO流的核心知识点,提升竞争力,为你的面试之旅保驾护航!

💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗💗


你知道BIO,NIO,AIO么?讲一下你的理解

BIO (Blocking I/O):同步阻塞I/O 模式,以流的方式处理数据,数据的读取写入必须阻塞在一个线程内等待其完成。适用于连接数目比较小且固定的架构

NIO (New I/O):同时支持阻塞与非阻塞模式,以块的方式处理数据,适用于连接数目多且连接比较短(轻操作)的架构,比如聊天器

AIO ( Asynchronous I/O):异步非阻塞I/O 模型,适用于连接数目多且连接比较长(重操作)的架构

你知道BIO,NIO,AIO吗?谈一下你的理解2

概念:同步与异步:同步是指业务在A线程开了B线程,A线程必须等待B线程完成才能继续执行。异步是指业务再上述情况不需要等待B线程完成就可以继续执行,A线程在之后可以通过事件或回调来确定B线程的返回结果。

阻塞与非阻塞:阻塞是指IO必须完成才能返回继续执行,但是非阻塞是在开始IO就返回一个状态值,不需要等待IO操作完成。

BIO:同步阻塞IO模型(Blocking IO)。以流的方式进行数据的读写,使用字节流或字符流。运行方式简而言之就是一个线程一个连接,且一个线程必须等待读写操作完成才能关闭线程,没有读取到数据会一直阻塞,等待客户端发送数据。高并发场景下,会创建大量的线程,大大占用系统资源。优化方法是使用线程池,使用与并发小的业务场景,且代码易于理解

NIO:同步非阻塞IO模型(Non-IO/New IO):以块的方式进行数据的读写,使用channel通道和缓冲区。运行方式简而言之就是一个线程多个连接,会有一个多路复用器去对连接轮询,有IO请求就创建线程进行执行,当读取不到客户端的数据也不会阻塞。适用于并发量高的业务场景。

AIO:异步非阻塞IO模型(New IO 2.0):AIO可以看成是NIO的增强版,引入了异步通道的概念。它简化了程序的编写,且要是有效的线程才会启动线程,会先是操作系统操作完成才会去通知服务端启动线程执行IO操作。适用于连接数目多且连接时间长的业务场景,但在性能上并没有高出NIO许多,运用并不广泛。

BIO具体的执行原理是怎么样的?谈谈你的理解?

BIO,也叫同步非阻塞IO模型,它的执行有着三大核心概念。分别是多路复用器(选择器selector),channel,buffer。

多路复用器:也叫选择器,NIO通过选择器来实现一个线程处理多个连接。多个channel注册到同一个选择器,选择器可以对channel进行监听,如果有读写事件,就对其进行处理。没有读写事件,线程可以干其他事情,提高了性能。

channel:channel是双向的,它不仅可以从buffer写入数据,还可以读取数据。和stream流很像,但是stream六只能单向的读或者写。

buffer:缓冲区,用于与channel进行数据交互。每个channel对应了一个buffer,即内存块,底层有一个数组。既可以写入数据,又可以读取数据。

java 中四大基础流

InputStream : 输入字节流, 也就是说它既属于输入流, 也属于字节流

OutputStream: 输出字节流, 既属于输出流, 也属于字节流

Reader: 输入字符流, 既属于输入流, 又属于字符流

Writer: 输出字符流, 既属于输出流, 又属于字符流

带缓冲区的流

BufferedInputStream 带缓冲区的字节输入

BufferedOutputStream 带缓冲区的输出流

BufferedReader : 带缓冲区的字符输入流

BufferedWriter : 带缓冲区的字符输出流

读文本用什么流,读图片用什么流

文本用字符输入流Reader,读图片用字节输入流InputStream

字符流和字节流有什么区别

字符流适用于读文本,字节流适用于读图片,视频,文件等。

字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元也就是一个字符。

字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据;字符流通常处理文本数据,它支持写入及读取Unicode码元

BufferedInputStream 用到什么设计模式

主要运用了俩个设计模式,适配器和装饰者模式

怎么实现一张图片拷贝

需要一个FileInputStream指向读取的文件,然后把它包装到BufferInputStream,使用BufferInputStream#read方法去读byte[],然后创建一个FileOutputStream指向输出文件,然后把它包装到BufferOutputStream,使用BufferOutputStream#write方法写byte[]到另外一个文件

怎么实现文本拷贝

和文件拷贝思路一样,只不过读的时候需要使用BufferedReader和FileReader,使用readline来读 , 写的时候需要BufferedWriter和 FileWriter,用wite来写


结语

🔥如果文章对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下小老弟,蟹蟹大咖们~ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值