简介:
本期文章将汇总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来写
结语
🔥如果文章对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下小老弟,蟹蟹大咖们~