当前位置: 首页 > news >正文

【面试高高手】——JavaIO篇(23题)

文章目录

    • 1.什么是Java IO?
    • 2.如何从数据传输方式理解IO流?
    • 3.Java IO设计上使用了什么设计模式?
    • 4.什么是Java NIO?
    • 5.什么时BIO?
    • 6.什么是AIO?
    • 7.你怎么理解同步IO和异步IO?
    • 8.你怎么理解阻塞IO和非阻塞IO?
    • 9.IO中的输入流和输出流有什么区别?
    • 10.字节流和字符流的区别?
    • 11.Java 流量有多少种类型?
    • 12.如何将字节流转化为字符流?
    • 13.如何将一个 java 将对象序列化到文件中?
    • 14.什么是 java序列化?
    • 15.如何实现 java 序列化?
    • 16.Filter流是什么?
    • 17.Filter流有哪些可用?
    • 18.解释java.io.Serializable接口?
    • 19.如何实现对象克隆?
    • 20.Java中的输入流和输出流有什么区别?
    • 21.Java中有几种类型的流?
    • 22.如何从数据操作上理解IO流?
    • 23.BIO、NIO、AIO三者区别以及适用场景?

在这里插入图片描述
在这里插入图片描述

1.什么是Java IO?

Java IO(Input/Output)是用于处理输入和输出操作的API,它允许程序与外部世界进行数据交互。

2.如何从数据传输方式理解IO流?

可以从三个不同的维度进行分类:

• 1、按照流的方向(输出输入都是站在程序所在内存的角度划分的)
• 输入流:只能从中读取数据【主要由InputStream和Reader作为基类】

• 输出流:只能向其写入数据【主要由outputStream和Writer作为基类】

• 2、按照流的操作颗粒度划分

• 字节流:以字节为单元,可操作任何数据【主要由InputStream和outPutStream作为基类】

• 字符流:以字符为单元,只能操作纯字符数据,比较方便【主要由Reader和Writer作为基类】

• 3、按照流的角色划分

• 节点流:可以从/向一个特定的IO设备(如磁盘,网络)读/写数据的流,也叫【低级流,主要由】

• 处理流:用于对一个已存在的流进行连接和封装,通过封装后的流来实现数据的读/写功能,也叫【高级流】

3.Java IO设计上使用了什么设计模式?

  • 单一职责原则(Single Responsibility Principle): 这是一个重要的面向对象设计原则,它要求一个类应该只有一个责任。在Java IO中,不同的类负责不同的I/O操作,如InputStream负责读取字节,OutputStream负责写入字节,这符合单一职责原则。
  • 装饰器模式(Decorator Pattern): Java IO中的缓冲流(如BufferedReader和BufferedWriter)以及过滤流(如GZIPInputStream和GZIPOutputStream)采用了装饰器模式。这些类通过组合来增强I/O流的功能,而不是通过继承来扩展。
BufferedReader br = new BufferedReader(new FileReader("file.txt"));

这里,BufferedReader装饰了FileReader,以提供缓冲读取的功能。

  • 策略模式(Strategy Pattern): Java IO库中的Charset和CharsetEncoder/CharsetDecoder类采用了策略模式。它们允许你根据不同的字符编码策略来进行字符编码和解码。
Charset utf8 = Charset.forName("UTF-8");
CharsetEncoder encoder = utf8.newEncoder();

这里,Charset对象充当策略对象,CharsetEncoder则根据不同的策略来执行编码操作。

  • 观察者模式(Observer Pattern): Java IO库中的File和DirectoryStream等类可用于监视文件系统中的文件和目录。这些类允许你注册观察者来监听文件系统事件,符合观察者模式。
Path directory = Paths.get("my_directory");
WatchService watchService = FileSystems.getDefault().newWatchService();
directory.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);

这里,WatchService充当观察者,监视文件系统中文件的创建事件。

4.什么是Java NIO?

Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

5.什么时BIO?

Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

6.什么是AIO?

Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

7.你怎么理解同步IO和异步IO?

  • 同步I/O(Synchronous I/O):
    阻塞模式: 在同步I/O中,当一个I/O操作被发起时,调用线程将被阻塞,直到操作完成或出错为止。这意味着线程会一直等待,无法执行其他任务。
    顺序执行: 同步I/O操作通常是按照它们的发起顺序依次执行的。每个操作必须等待前一个操作完成才能继续执行。
    资源占用: 同步I/O需要分配一个线程来处理每个I/O操作,如果有大量并发连接,将消耗大量线程资源。

  • 异步I/O(Asynchronous I/O):
    非阻塞模式: 在异步I/O中,当一个I/O操作被发起后,调用线程不会被阻塞,可以继续执行其他任务,不必等待操作完成。
    并发性: 异步I/O允许同时发起多个I/O操作,并在后台进行处理,因此具有更高的并发性。
    回调机制: 异步I/O通常使用回调函数来处理I/O操作完成的通知。当I/O操作完成时,系统会调用预先注册的回调函数,而不是等待线程。
    复杂性: 异步I/O编程相对更复杂,因为它需要处理回调函数、状态管理等复杂性问题。

8.你怎么理解阻塞IO和非阻塞IO?

阻塞IO:当一个线程执行I/O操作时,它将一直阻塞该线程被一直占用,直到操作完成。
非阻塞IO:调用线程不会被阻塞,可以继续执行其他任务,不必等待操作完成。允许一个线程管理多个通道(连接)。

9.IO中的输入流和输出流有什么区别?

10.字节流和字符流的区别?

答:读字节流时,读一个字节后返回一个字节;字节流使用字节流读取一个或多个字节(中文对应的字节数为两个,在 UTF-8 码表中是 3 字节)时间。首先检查指定的编码表,并返回找到的字符。字节流可以处理图片、MP3、AVI视频文件等各种类型的数据,而字符流只能处理字符数据。除了字节流,只要是处理纯文本数据,就要优先使用字符流。字节流主要是操作 byte 类型数据,以 byte 以数组为准,主要操作类别为 OutputStream、Inputstream字符流处理的单元是 2 个字节的 Unicode 字符分别操作字符、字符数组或字符串,字节流处理单元为 1 操作字节和字节数组的字节。因此,字符流是由 Java 将字节转换为虚拟机 2 个字节的 Unicode 字符是单位字符制成的,所以对多国语言有很好的支持!如果是音频文件、图片和歌曲,最好使用字节流。如果与中文(文本)有关,最好使用字符流。在程序中,一个字符等于两个字节,java 提供了 Reader、Writer 两个专门操作字符流的类别。

11.Java 流量有多少种类型?

答:
(1)按流量方向:输入流(inputStream)和输出流(outputStream);
(2)按实现功能划分:节点流(可以从或到特定的地方(节点)读写数据。如 FileReader)和处理流(是对现有流的连接和封装,通过封装流的功能调用实现数据读写。如 BufferedReader。处理流的结构方法总是以其他流对象为参数。一个流对象通过其他流多次包装,称为流链接);
(3)按处理数据的单位: 字节流和字符流。继承字节流 InputStream 和 OutputStrea,InputStreamreader继承字符流 和 OutputStreamWriter 。

12.如何将字节流转化为字符流?

答:字节输入流通字符输入流通 InputStreamReader 这种结构函数可以实现并传输 InputStream 对象。
字节输出流字符输出流通过 OutputStreamWriter 这种结构函数可以实现并传输 OutputStream 对象。

13.如何将一个 java 将对象序列化到文件中?

答:在 java 能够序列化的类必须先实现 Serializable 接口,没有抽象的方法,只是起到了标记作用。

  public class Test {public static void main(String[] args) throws Exception {// 对象输出流ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("D://obj")));objectOutputStream.writeObject(new User("zhangsan", 100));objectOutputStream.close();// 对象输入流ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("D://obj")));User user = (User) objectInputStream.readObject();System.out.println(user);objectInputStream.close();}}

14.什么是 java序列化?

答:序列化是一种处理对象流的机制。所谓对象流,就是流化对象的内容。流化后的对象可以读写,也可以在网络之间传输。序列化是为了解决对象流读写操作中引起的问题。

15.如何实现 java 序列化?

答:实现序列化将需要实现序列化类Serializable 界面,界面没有实现的方法,implements Serializable 只是为了标记对象可以序列化,然后使用输出流(如:File Output Stream)来构造一个 Object Output Stream(对象流)对象,然后,使用 Object Output Stream 对象的 write Object(Object obj)该方法可以将参数为 obj 对象写出(即保存其状态),如果要恢复,则使用输入流。

16.Filter流是什么?

答:Filter Stream是IO流的主要功能,用于为存在的流量增加一些额外的功能,如向目标文件添加源文件中不存在的行数或复制性能。

17.Filter流有哪些可用?

答:在http://java.主要由四个可用的filter包组成 Stream。两个字节filter stream,两个字符filter stream. 分别是Filter Input Stream, Filter Output Stream, Filter Reader and Filter Writer.这些类别是抽象的,不能实例化。

18.解释java.io.Serializable接口?

答:通过实现类 java.io.Serializable 该接口可以启用其序列化功能。未实现此接口的类别将无法使其任何状态序列化或反序列化。

19.如何实现对象克隆?

答:有两种方式(1)实现 Cloneable 接口并重写 Object 类中的 clone()方法(2)实现 Serializable 接口可以通过对象的序列化和反序列化来实现真正的深度克隆。

20.Java中的输入流和输出流有什么区别?

输入流用于从数据源(如文件或网络)读取数据,输出流用于向目标(如文件或网络)写入数据。

21.Java中有几种类型的流?

分为字符流和字节流。

22.如何从数据操作上理解IO流?

在这里插入图片描述

23.BIO、NIO、AIO三者区别以及适用场景?

  • BIO(Blocking I/O):
    阻塞模型: BIO是基于阻塞模型的I/O操作,意味着当一个线程执行I/O操作时,它将一直阻塞,直到操作完成。
    同步性: 在BIO中,所有I/O操作都是同步的,一个线程对一个连接进行读或写,直到完成。
    适用性: 适用于连接数量较少且每个连接的数据交互频繁的情况,但在高并发环境下性能不佳。

  • NIO(Non-blocking I/O):
    非阻塞模型: NIO采用了非阻塞模型,允许一个线程管理多个通道(连接)。
    选择器(Selector): NIO引入了选择器(Selector)的概念,通过选择器一个线程可以监听多个通道上的事件,如读就绪、写就绪等。
    缓冲区(Buffer): NIO使用缓冲区来存储数据,可以提高I/O效率。
    适用性: 适用于需要处理大量连接且连接数较多,但每个连接的数据交互相对较少的情况,如Web服务器。

  • AIO(Asynchronous I/O):
    异步模型: AIO采用异步模型,允许一个线程在进行I/O操作时不被阻塞,当操作完成后会通知应用程序。
    回调机制: AIO使用回调机制来处理I/O操作完成的通知。
    适用性: 适用于需要处理大量连接且每个连接的数据交互较少,且希望充分利用CPU的多核性能的情况。

  • 总结各种I/O模型的适用场景:
    BIO适用于连接数较少,且每个连接的数据交互频繁的情况,但不适用于高并发环境。
    NIO适用于需要处理大量连接,但每个连接的数据交互相对较少的情况,具有更好的性能和资源利用率。
    AIO适用于需要处理大量连接,且每个连接的数据交互较少,同时希望充分利用CPU多核性能的情况。
    选择适当的I/O模型取决于应用程序的特性和需求,不同的模型提供了不同的性能和可伸缩性。

相关文章:

【面试高高手】——JavaIO篇(23题)

文章目录 1.什么是Java IO?2.如何从数据传输方式理解IO流?3.Java IO设计上使用了什么设计模式?4.什么是Java NIO?5.什么时BIO?6.什么是AIO?7.你怎么理解同步IO和异步IO?8.你怎么理解阻塞IO和非阻塞IO?9.IO中的输入流和输出流有…...

图像采集 deep OCR

按照芯片类型可以分为CCD相机、CMOS相机 按照传感器的结构特性可以分为线阵相机、面阵相机 按照扫描方式可以分为隔行扫描相机、逐行扫描相机 按照分辨率大小可以分为普通分辨率相机、高分辨率相机按照输出信号方式可以分为模拟相机、数字相机 按照输出色彩可以分为单色(黑白)相…...

Linux 终端命令总结

一、常用的七条命令 命令 对应英文作用lslist查看当前文件夹下的内容pwdprint work directory查看当前所在文件夹cd [目录名]change directory切换文件夹 touch [文件名]touch如果文件不存在新建文件mkdir [目录名]make directory创建目录rm[文件名]remo…...

中国核动力研究设计院使用 DolphinDB 替换 MySQL 实时监控仪表

随着仪表测点的大幅增多和采样频率的增加,中国核动力研究设计院仪控团队原本基于 MySQL 搭建的旧系统已经无法满足大量数据并发写入、实时查询和聚合计算的需求。他们在研究 DB-Engines 时序数据库榜单时了解到国内排名第一的 DolphinDB。经过测试,发现其…...

速看!软考中项100条重要知识点集锦!

1. 项目的特点有哪些? 2. 项目的组织方式有哪些?分别具有什么优缺点? 3. 项目管理过程组有哪些? 4. 怎么样才能成为一位优秀的项目经理? 5. PMO的主要职能有哪些? 6. 项目经理(PM&#xff…...

Pycharm在进行debug时出现collecting data如何解决?

Pycharm在进行debug时变量界面出现collecting data,问题如下: 解决方法:打开Setting界面,在Python Debugger选项中勾选下图中的Gevent compatible即可。...

【算法分析与设计】算法概述

目录 一、学习要点二、算法的定义三、算法的性质四、程序(Program)五、问题求解(Problem Solving)六、算法的描述七、算法分析的目的八、算法复杂性分析(一)算法时间复杂性分析(二)算法渐近复杂性1、渐进上界记号-大O符号2、渐进下…...

如何进一步全面提高项目估算精准度?

项目估算非常重要,这直接关系着项目的成本和收入,如果估算不准确,将为项目带来较大风险。一般软件规模可以用多种方式进行估算,但是用功能点估算方式更准确,而自动估算让估算更快速,我们以CoCode开发的估算…...

Git学习笔记4

GitHub是目前最火的开源项目代码托管平台。它是基于web的Git仓库,提供公有仓库和私有仓库,但私有仓库是需要付费的。 到Github上找类似的项目软件。 GitLab可以创建免费的私有仓库。 GitLab是利用 Ruby开发的一个开源的版本管理系统,实现一个…...

【红外与可见光图像融合】离散平稳小波变换域中基于离散余弦变换和局部空间频率的红外与视觉图像融合方法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

成都睿趣科技:抖音开通橱窗带货需要钱吗

随着社交媒体和电子商务的蓬勃发展,抖音作为一种流行的短视频平台,也推出了自己的“抖音橱窗”功能,让内容创作者能够通过视频展示和销售产品,从而实现商业化。那么,抖音橱窗带货是否需要费用呢? 首先,要开…...

中间件 - 分布式协调服务Zookeeper

目录 一. 前言 二. 树状结构 2.1. ZNode 2.1.1. stat 2.1.2. ACL 三. NameService命名服务 四. Configuration 配置管理 五. GroupMembers 集群管理 六. 集群三个角色及状态 七. 选举算法 八. Watcher 九. 设计目的 十. 典型使用场景 一. 前言 Zookeeper是一个分布…...

golang的实用工具

golang的实用工具 Go 语言提供了许多实用的工具,以下是其中一些常用的工具: 1. go run:用于直接运行 Go 源代码文件,无需显式编译。 2. go build:用于将 Go 代码编译成可执行文件或库。 3. go test:用于…...

图层混合模式(三)

差值模式 差值模式:查看每个通道的数值,用基色减去混合色或用混合色减去基色。具体取决于混合色与基色那个通道的数值更大。白色与任何颜色混合得到反相色,黑色与任何颜色混合颜色不变。 计算公式:结果色 绝对值(混合…...

蓝牙核心规范(V5.4)10.6-BLE 入门笔记之L2CAP

蓝牙篇之蓝牙核心规范(V5.4)深入详解汇总 1.概述 L2CAP负责协议复用、流量控制、服务数据单元(SDU)的分段和重组。它使用通道的概念来分隔在堆栈层之间传递的数据包序列。固定通道不需要设置,立即可用,并与特定的上层协议相关联。通道也可以通过指定的协议服务多路复用器…...

【计算机网络】DNS原理介绍

文章目录 DNS提供的服务DNS的工作机理DNS查询过程DNS缓存 DNS记录和报文DNS记录DNS报文针对DNS服务的攻击 DNS提供的服务 DNS,即域名系统(Domain Name System) 提供的服务 一种实现从主机名到IP地址转换的目录服务,为Internet上的用户应用程序以及其他…...

Docker的基础命令

目录 一、镜像操作 1、搜索镜像 2、下载镜像 3、查看镜像 3.1 查看下载到本地的所有镜像 3.2 查看单个镜像的详细信息 4、为镜像添加新的标签 5、镜像导出和导入到本地 5.1 镜像导出到本地 5.2 导入镜像 6、删除镜像 7、批量删除镜像 8、上传镜像 8.1 官网注册登录…...

提取项目依赖包的licenses

skywalking-eyes工具可以快速提取出licenses...

Vue项目自动转换px为rem-高保真还原设计图

前端开发中还原设计图的重要性毋庸置疑,目前来说应用最多的应该也还是使用rem。然而很多人依然还是处于刀耕火种的时代,要么自己去计算rem值,要么依靠编辑器安装插件转换。 而本文的目标就是通过一系列的配置后,在开发中可以直接使…...

rman备份到远程服务器

rman备份到远程服务器磁盘 原因 业务数据量较大,数据库服务器上无足够地空间存放rman备份,磁盘扩容申请不批。无奈采取nfs远程备份 环境信息 ip操作系统备份目录远程备份服务器192.168.3.130Centos7.9rmanbak数据库服务器192.168.3.132:1521Centos7.…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...

结构化文件管理实战:实现目录自动创建与归类

手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...

使用python进行图像处理—图像滤波(5)

图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值,以达到平滑(去噪)、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算,…...

多模态学习路线(2)——DL基础系列

目录 前言 一、归一化 1. Layer Normalization (LN) 2. Batch Normalization (BN) 3. Instance Normalization (IN) 4. Group Normalization (GN) 5. Root Mean Square Normalization(RMSNorm) 二、激活函数 1. Sigmoid激活函数(二分类&…...

河北对口计算机高考MySQL笔记(完结版)(2026高考)持续更新~~~~

MySQL 基础概念 数据(Data):文本,数字,图片,视频,音频等多种表现形式,能够被计算机存储和处理。 **数据库(Data Base—简称DB):**存储数据的仓库…...

安宝特案例丨寻医不再长途跋涉?Vuzix再次以AR技术智能驱动远程医疗

加拿大领先科技公司TeleVU基于Vuzix智能眼镜打造远程医疗生态系统,彻底革新患者护理模式。 安宝特合作伙伴TeleVU成立30余年,沉淀医疗技术、计算机科学与人工智能经验,聚焦医疗保健领域,提供AR、AI、IoT解决方案。 该方案使医疗…...