Java I/O(输入/输出)——针对实习面试

目录

  • Java I/O(输入/输出)
    • 什么是Java I/O流?
    • 字节流和字符流有什么区别?
    • 什么是缓冲流?为什么要使用缓冲流?
    • Java I/O中的设计模式有哪些?
    • 什么是BIO?
    • 什么是NIO?
    • 什么是AIO?

Java I/O(输入/输出)

在这里插入图片描述

什么是Java I/O流?

Java I/O流是一种抽象,用于处理输入和输出数据。流可以是字节流InputStreamOutputStream)或字符流ReaderWriter)。

字节流用于处理原始二进制数据,例如文件读写、网络通信等。字符流则用于处理文本数据,它们提供了对字符的更高层次的抽象,使得读写文本更加方便。

Java I/O流的主要特点包括:

  1. 抽象:I/O流提供了一种抽象的方式来处理输入和输出,使得程序员不需要关心底层的硬件和操作系统细节。

  2. 可扩展性:Java的I/O流设计为可扩展的,可以通过继承和实现接口来创建自定义的输入/输出流。

  3. 缓冲:为了提高性能,Java提供了缓冲流(如BufferedReaderBufferedWriter),它们可以减少物理读取的次数

  4. 过滤:Java I/O流支持过滤,可以通过装饰器模式添加额外的功能,如数据压缩、加密等。

  5. 字符集支持:Java I/O流支持多种字符集,可以处理不同语言的文本数据。

  6. 异常处理:Java I/O操作可能会抛出IOException异常,需要程序员进行适当的异常处理。

  7. 资源管理:Java 7引入了try-with-resources语句,可以自动管理实现了AutoCloseable接口的资源,确保在语句结束时自动关闭资源。

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

字节流和字符流是Java I/O中处理数据流的两种方式,它们的主要区别如下:

  1. 处理的数据类型不同

    • 字节流:处理的是字节数据,即原始二进制数据。字节流主要用于处理图像、音频、视频等二进制文件,以及网络通信。
    • 字符流:处理的是字符数据,即文本数据。字符流用于处理文本文件,如读取和写入文本内容。
  2. 使用的类不同

    • 字节流:主要使用InputStreamOutputStream作为基类,以及它们的子类,如FileInputStreamFileOutputStreamBufferedInputStreamBufferedOutputStream等。
    • 字符流:主要使用ReaderWriter作为基类,以及它们的子类,如FileReaderFileWriterBufferedReaderBufferedWriter等。
  3. 缓冲区

    • 字节流:通常不使用缓冲区,每次读写一个字节。
    • 字符流:通常使用缓冲区,可以提高读写效率。例如,BufferedReader可以一次读取一行文本,而BufferedWriter可以一次写入一行文本。
  4. 字符编码

    • 字节流不涉及字符编码,因为它们处理的是原始字节。
    • 字符流涉及字符编码,因为它们处理的是字符。在读写字符流时,需要指定字符编码,如UTF-8、GBK等。
  5. 应用场景

    • 字节流:适用于所有类型的文件,特别是二进制文件。
    • 字符流:适用于文本文件,如读取和写入文本内容。
  6. 性能

    • 字节流:在处理大文件或二进制文件时,性能可能不如字符流,因为它们每次处理一个字节。
    • 字符流:由于使用了缓冲区,通常在处理文本文件时性能更好
  7. 读写方式

    • 字节流:通常需要手动处理数据的读写,例如,需要指定每次读取的字节数。
    • 字符流:提供了更高级别的读写方法,如readLine()write(String),使得读写文本更加方便。

在实际编程中,选择字节流还是字符流通常取决于要处理的数据类型和性能需求。
对于文本文件,通常推荐使用字符流;
对于二进制文件,如图片、音频等,则使用字节流

什么是缓冲流?为什么要使用缓冲流?

缓冲流是一种特殊的流,它对其他输入/输出流进行包装,提供数据的缓冲功能。缓冲流分为两种:缓冲字节流(BufferedInputStreamBufferedOutputStream)和缓冲字符流(BufferedReaderBufferedWriter)。

缓冲流的工作原理:

缓冲流内部维护一个缓冲区,这个缓冲区是一块内存区域,用于临时存储从底层流读取的数据或即将写入到底层流的数据。
当缓冲区时,数据会被一次性写入到底层流
当缓冲区时,会从底层流中一次性读取足够的数据填满缓冲区
这种机制减少了物理读取和写入的次数,从而提高了I/O操作的效率。

为什么要使用缓冲流:

  1. 提高性能:由于减少了物理读写操作的次数,缓冲流可以显著提高I/O操作的性能,特别是对于大量的数据读写操作。

  2. 减少系统调用:缓冲流通过减少系统调用来提高性能。系统调用是一个相对昂贵的操作,因为它涉及到用户态和内核态之间的切换。

  3. 简化编程模型:缓冲流提供了一些便捷的方法,如readLine()write(String),这些方法使得读写文本数据更加简单和直观。

  4. 自动资源管理:在Java 7及以上版本中,缓冲流可以与try-with-resources语句一起使用,这样可以自动管理资源的关闭,减少资源泄漏的风险。

  5. 支持多种字符集:对于字符流,缓冲流如BufferedReader可以支持多种字符编码,使得读写不同编码的文本文件更加方便。

  6. 提高读写效率:对于字符流,缓冲流可以一次读取或写入一个字符数组,这比一次读取或写入一个字符更高效。

总之,缓冲流通过减少物理读写操作的次数,提高了I/O操作的效率和性能,同时也简化了编程模型。在实际开发中,推荐使用缓冲流来处理大量的数据读写操作。

Java I/O中的设计模式有哪些?

Java I/O库中使用了多种设计模式,主要包括以下几种:

  1. 装饰器模式(Decorator Pattern)
    Java I/O库广泛使用了装饰器模式来增强类的功能,而不改变其结构。通过装饰器模式,可以在运行时动态地添加功能。例如,BufferedInputStreamBufferedOutputStream等类通过装饰原始流来提供缓冲功能。

  2. 适配器模式(Adapter Pattern)
    适配器模式允许不兼容的接口协同工作。在Java I/O中,适配器模式用于将字节流转换为字符流。例如,InputStreamReaderOutputStreamWriter将字节流转换为字符流。

  3. 工厂模式(Factory Pattern)
    工厂模式用于创建对象,而不需要指定将要创建的对象的具体类。在Java I/O中,工厂模式用于创建不同类型的流对象。例如,InputStreamOutputStream的子类通常通过工厂方法(如FileInputStreamBufferedInputStream等)创建。

  4. 单例模式(Singleton Pattern)
    单例模式确保一个类只有一个实例,并提供一个全局访问点。虽然Java I/O库中没有直接使用单例模式,但在某些情况下,可以确保某些流对象(如System.inSystem.outSystem.err)是单例。

  5. 观察者模式(Observer Pattern)
    观察者模式定义了对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。在Java I/O中,这种模式可以用于监控流的状态变化,例如,当流关闭时,可以通知相关的对象。

  6. 建造者模式(Builder Pattern)
    建造者模式用于创建一个复杂对象,它允许通过指定复杂对象的类型和内容逐步构造一个复杂对象。虽然Java I/O库中没有直接使用建造者模式,但在创建复杂的流对象时,可以类比使用这种模式。

  7. 策略模式(Strategy Pattern)
    策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互换。策略模式让算法的变化独立于使用算法的客户。在Java I/O中,策略模式可以用于选择不同的读写策略。

  8. 模板方法模式(Template Method Pattern)
    模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中实现。在Java I/O中,模板方法模式可以用于定义读取或写入数据的基本步骤,而具体的实现则由子类提供。

什么是BIO?

BIO(Blocking I/O,阻塞I/O)是Java I/O模型中的一种,它指的是在进行I/O操作时,如果数据还没有准备好,或者输出缓冲区已满,操作将会阻塞当前线程,直到数据准备好或者缓冲区可用。

在BIO模型中,服务器客户端之间的通信通常是通过套接字(Socket)进行的。当服务器接收到客户端的连接请求后,它会为每个连接创建一个线程来处理这个连接。如果服务器需要处理大量的并发连接,那么就需要为每个连接都创建一个线程,这会导致资源的消耗和管理的复杂性。

BIO的特点是:

  1. 同步阻塞:在读取数据时,线程会被阻塞,直到数据完全读取完毕。同样,在写入数据时,线程会被阻塞,直到数据完全写入。

  2. 简单易懂:BIO模型相对简单,易于理解和实现。

  3. 资源消耗:由于每个连接都需要一个线程,当并发连接数较多时,会占用大量的系统资源,可能导致性能瓶颈。

  4. 扩展性差:在高并发场景下,BIO模型由于线程资源消耗大,扩展性较差,难以支撑大规模的网络服务。

由于BIO的这些限制,Java在NIO(New I/O,非阻塞I/O)模型中引入了非阻塞I/O操作,以解决BIO在高并发场景下的性能问题。NIO通过使用缓冲区(Buffer)、通道(Channel)和选择器(Selector)等概念,允许服务器使用单个线程来处理多个连接,从而提高了系统的并发处理能力。

什么是NIO?

NIO(New Input/Output)是Java的一个用于处理输入和输出的API,它是在Java 1.4版本中引入的,用以替代旧的阻塞I/O模型(BIO)。NIO的设计目标是提供一种更为高效、可伸缩的I/O处理方式,特别是在处理大量连接和高并发场景下。

NIO的核心特性包括:

  1. 缓冲区(Buffer)

    • NIO中的数据操作都是基于缓冲区的。缓冲区本质上是一个数组,可以是字节数组(ByteBuffer)或字符数组(CharBuffer等)。
    • 缓冲区提供了对数据的结构化访问,并跟踪系统的读/写过程。
  2. 通道(Channel)

    • 通道是NIO中的一个关键概念,它代表了一个打开的连接,可以用于读取和写入数据。
    • 与传统的流(Stream)不同,通道是双向的,即可以读取数据,也可以写入数据。
    • 常见的通道有FileChannelDatagramChannelSocketChannelServerSocketChannel等。
  3. 选择器(Selector)

    • 选择器用于监听多个通道的事件(如连接打开、数据到达等)。
    • 单个线程可以管理多个通道,这就是NIO支持高并发的基础。
    • 通过选择器,一个线程可以处理多个网络连接提高了程序的伸缩性和性能
  4. 非阻塞模式

    • NIO的I/O操作默认是非阻塞的。这意味着,如果读取数据尚未准备好,或者写入的数据无法被立即发送,线程可以去做其他事情,而不是被挂起等待。
  5. 文件锁定和内存映射文件

    • NIO还提供了文件锁定机制和内存映射文件的功能,这些在BIO中是不支持的。
  6. 字符集支持

    • NIO提供了对字符集编码和解码的支持,使得字符数据的读写更加方便。

NIO的使用通常比BIO更为复杂,但它提供了更高的性能更好的资源管理,特别是在需要处理大量连接和高并发请求的服务器应用程序中。例如,在构建高性能的网络服务器或客户端时,NIO是一个非常重要的工具。

什么是AIO?

AIO(Asynchronous I/O,异步I/O)是Java 7中引入的一种非阻塞I/O模型,它是NIO的扩展,提供了真正的异步I/O操作。与NIO不同,AIO中的I/O操作不会导致线程阻塞,当I/O操作完成时,系统会自动通知应用程序。

AIO的核心特性包括:

  1. 异步通道(AsynchronousChannel)

    • AIO中的通道(Channel)是异步的,它们支持真正的异步I/O操作。
    • 当进行读写操作时,应用程序可以提交一个I/O请求,然后可以继续执行其他任务,而不需要等待I/O操作完成。
  2. 回调通知

    • AIO使用回调机制来处理I/O操作的结果。当I/O操作完成时,系统会调用预先注册的回调函数来处理结果。
    • 这种方式避免了线程的阻塞,提高了程序的并发性响应性
  3. 事件和回调

    • AIO通过事件和回调机制来处理I/O操作,这使得应用程序可以更加灵活地处理I/O事件
    • 应用程序可以注册多个回调函数,以便在I/O操作完成时执行不同的操作。
  4. 无阻塞操作

    • AIO的I/O操作不会阻塞线程,这使得应用程序可以处理更多的并发连接,而不会导致线程资源的浪费。
  5. 更好的资源利用

    • 由于AIO不会导致线程阻塞,因此可以更有效地利用系统资源,尤其是在高并发和大量连接的场景下。
  6. 支持多种I/O模型

    • AIO支持多种I/O模型,包括阻塞、非阻塞和异步,这使得它可以根据不同的应用场景灵活选择。

AIO的使用通常比NIO更为复杂,但它提供了更高的性能和更好的资源管理,特别是在需要处理大量并发连接和高性能I/O操作的服务器应用程序中。例如,在构建高性能的网络服务器或客户端时,AIO是一个非常重要的工具。

需要注意的是,AIO在某些操作系统上的支持可能不如NIO完善,因此在实际开发中需要根据目标平台的支持情况来选择合适的I/O模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471824.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Exploring Defeasible Reasoning in Large Language Models: A Chain-of-Thought A

文章目录 题目摘要简介准备工作数据集生成方法实验结论 题目 探索大型语言模型中的可废止推理:思路链 论文地址:http://collegepublications.co.uk/downloads/LNGAI00004.pdf#page136 摘要 许多大型语言模型 (LLM) 经过大量高质量数据语料库的训练&…

数据结构--数组

一.线性和非线性 线性:除首尾外只有一个唯一的前驱和后继。eg:数组,链表等。 非线性:不是线性的就是非线性。 二.数组是什么? 数组是一个固定长度的存储相同数据类型的数据结构,数组中的元素被存储在一…

MySQL技巧之跨服务器数据查询:基础篇-更新语句如何写

MySQL技巧之跨服务器数据查询:基础篇-更新语句如何写 上一篇已经描述:借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的连接名: MY_ODBC_MYSQL 以及用同样的…

Unity教程(十八)战斗系统 攻击逻辑

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…

前端学习八股资料CSS(二)

更多详情:爱米的前端小笔记,更多前端内容,等你来看!这些都是利用下班时间整理的,整理不易,大家多多👍💛➕🤔哦!你们的支持才是我不断更新的动力!找…

云计算研究实训室建设方案

一、引言 随着云计算技术的迅速发展和广泛应用,职业院校面临着培养云计算领域专业人才的迫切需求。本方案旨在构建一个先进的云计算研究实训室,为学生提供一个集理论学习、实践操作、技术研发与创新于一体的综合性学习平台,以促进云计算技术…

通过Python 调整Excel行高、列宽

在Excel中,默认的行高和列宽可能不足以完全显示某些单元格中的内容,特别是当内容较长时。通过调整行高和列宽,可以确保所有数据都能完整显示,避免内容被截断。合理的行高和列宽可以使表格看起来更加整洁和专业,尤其是在…

【代码审计】常见漏洞专项审计-业务逻辑漏洞审计

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 0x01 漏洞介绍 1、 原理 业务逻辑漏洞是一类特殊的安全漏洞,业务逻辑漏洞属于设计漏洞而非实…

Wordpress常用配置,包括看板娘跨域等

一个Wordpress的博客已经搭建完成了,那么为了让它看起来更有人间烟火气一点,有一些常用的初始配置,这里整理一下。 修改页脚 页脚这里默认会显示Powered by Wordpress,还有一个原因是这里要加上备案信息。在主题里找到页脚&…

数据库范式、MySQL 架构、算法与树的深入解析

一、数据库范式 在数据库设计中,范式是一系列规则,用于确保数据的组织和存储具有良好的结构、完整性以及最小化的数据冗余。如果不遵循范式设计,数据可能会以平铺式罗列,仅使用冒号、分号等简单分隔。这种方式存在诸多弊端&#…

Taro React-Native IOS 打包发布

http网络请求不到 配置 fix react-native facebook::flipper::SocketCertificateProvider‘ (aka ‘int‘) is not a function or func_rn运行debug提示flipper-CSDN博客 Xcode 15(iOS17)编译适配报错_no template named function in namespace std-CS…

基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要:车型识别在交通管理、智能监控和车辆管理中起着至关重要的作用,不仅能帮助相关部门快速识别车辆类型,还为自动化交通监控提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的车型识别模型,该模型使用了…

从python源码到可自动更新软件

相关阅读 标题链接如何打包python程序为exebczl【auto-py-to-exe 可视化打包python到exe】51CTO ZATA 1. python源码 打包时需要特别注意的源码编写规范 除了基本的 Python 编码规范之外,在准备程序进行打包时,还需要特别注意以下几点: 1.1 依赖管理 确保 requirements.t…

javaWeb小白项目--学生宿舍管理系统

目录 一、检查并关闭占用端口的进程 二、修改 Tomcat 的端口配置 三、重新启动 Tomcat 一、javaw.exe的作用 二、结束javaw.exe任务的影响 三、如何判断是否可以结束 结尾: 这个错误提示表明在本地启动 Tomcat v9.0 服务器时遇到了问题,原因是所需…

k8s笔记——核心概念

什么是K8s Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。 Kubernetes 最初是由 Google 工程师作为 Borg 项目开发和设计的,后于 2015 年捐赠给 云原生计算基金会(CNCF)。 什么是 Kubernetes 集群…

SkyWalking-安装

SkyWalking-简单介绍 是一个开源的分布式追踪系统,用于检测、诊断和优化分布式系统的功能。 支持 ElasticSearch、H2、MySQL、PostgreSql 等数据库 基于 ElasticSearch 的情况 ElasticSearch(ES) 安装 1、下载并解压 https://www.elastic…

怎么样绑定域名到AWS(亚马逊云)服务器

1,拿着你买的域名去亚马逊申请一个证书。申请证书分两种,一种是去亚马逊后台填域名手动申请 ,另一种是通过API来申请,类似如下代码: 2、证验证书。有两种方式:一种是通过邮件,另一种去到域名提供…

C++常用的新特性-->day06

时间间隔duration duration表示一段时间间隔&#xff0c;用来记录时间长度&#xff0c;可以表示几秒、几分钟、几个小时的时间间隔。duration的原型如下 // 定义于头文件 <chrono> template<class Rep,class Period std::ratio<1> > class duration;Rep&…

云服务器端口开放

云服务器一般除了必要端口&#xff0c;其它端口默认都是关闭的&#xff0c;要想进行网络通信就必须开放指定的端口。下面以腾讯云服务器为例来进行详细说明。 腾讯云的轻量服务器是没有安全组的&#xff0c;这里有的只是防火墙&#xff0c;开放端口也是通过防火墙来设置的。首先…

[Linux网络编程]10-http协议,分别使用epoll和libevent两种方式实现B/S服务器

一.HTTP协议&#xff0c;Request请求和Response响应 二.常用状态码 接下来使用两种方式构建B/S模型,实现浏览器向客户端请求文件的功能。 浏览器向构建好的服务器发送请求&#xff0c;在请求行中请求具体文件&#xff0c;服务器连通客户端(浏览器)后&#xff0c;检查文件是否存…