【Java 问题】基础——IO

news2024/9/26 20:09:21

接上文

IO

  • 42.Java 中 IO 流分为几种?
    • Java IO体系中的装饰器模式
        • 抽象组件(Component)
        • 具体组件(Concrete Component)
        • 抽象装饰器(Decorator)
        • 具体装饰器(Concrete Decorator)
        • 使用装饰器
        • 总结
  • 43.既然有了字节流,为什么还要有字符流?
  • 44.BIO、NIO、AIO?

42.Java 中 IO 流分为几种?

流按照不同的特点,有很多种划分方式。

  • 按照流的流向分,可以分为输入流和输出流;
  • 按照操作单元划分,可以划分为字节流和字符流;
  • 按照流的角色划分为节点流和处理流

Java Io流共涉及40多个类,看上去杂乱,其实都存在一定的关联, Java I0流的40多个类都是从如下4个抽象类基类中派生出来的。

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

IO流用到了什么设计模式?

其实,Java的IO流体系还用到了一个设计模式——装饰器模式。

InputStream相关的部分类图如下,篇幅有限,装饰器模式就不展开说了。

在这里插入图片描述

装饰器模式(Decorator Pattern)是一种设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有类的一个包装。
装饰器模式通常用于以下场景:

  • 在不影响其他对象的情况下,想要动态地给单个对象添加一些额外的职责。
  • 当不能采用生成子类的方法进行扩充时,这种情况可能是因为类定义被隐藏,或者类定义不能用于生成子类。
    在Java的IO体系中,装饰器模式被广泛使用,用于对输入输出流进行功能扩展。

Java IO体系中的装饰器模式

在Java的IO库中,有四个基本抽象类:

  • InputStream:所有输入流的超类。
  • OutputStream:所有输出流的超类。
  • Reader:所有读取字符流的超类。
  • Writer:所有写入字符流的超类。
    这些抽象类有多个实现,装饰器类也实现了这些抽象类,并提供了额外的功能。
    下面是一个简单的例子来说明装饰器模式在Java IO体系中的应用:
抽象组件(Component)
public abstract class InputStream {
    // 抽象方法,子类必须实现
    public abstract int read() throws IOException;
    // 其他方法...
}
具体组件(Concrete Component)
public class FileInputStream extends InputStream {
    // 实现了从文件读取字节的方法
    public int read() throws IOException {
        // 读取文件内容的实现...
    }
}
抽象装饰器(Decorator)
public abstract class FilterInputStream extends InputStream {
    protected volatile InputStream in; // 被装饰的对象
    protected FilterInputStream(InputStream in) {
        this.in = in;
    }
    // 默认实现,直接调用被装饰对象的相应方法
    public int read() throws IOException {
        return in.read();
    }
    // 其他方法...
}
具体装饰器(Concrete Decorator)
public class BufferedInputStream extends FilterInputStream {
    // 构造方法,接收一个InputStream对象
    public BufferedInputStream(InputStream in) {
        super(in);
    }
    // 重写read方法,添加缓冲功能
    public int read() throws IOException {
        // 添加缓冲逻辑...
        return in.read();
    }
    // 其他方法...
}
使用装饰器
InputStream in = new FileInputStream("file.txt");
InputStream bufferedIn = new BufferedInputStream(in);
int data = bufferedIn.read(); // 使用带缓冲的读取方式

在这个例子中,BufferedInputStream 是一个装饰器,它给 FileInputStream 添加了缓冲的功能。客户端代码可以透明地使用 BufferedInputStream,就像使用普通的 InputStream 一样,但获得了额外的缓冲功能。

总结

装饰器模式的关键优点是它提供了比继承更灵活的扩展功能的方式。通过使用装饰器,可以动态地添加或删除功能,而不需要修改现有代码。Java IO体系中的装饰器模式允许开发者根据需要组合不同的流来创建具有复杂功能的流处理管道。

43.既然有了字节流,为什么还要有字符流?

其实字符流是由 Java 虚拟机将字节转换得到的,问题就出在这个过程还比较耗时,并且,如果我们不知道编码类型就很容易出现乱码问题。

所以, I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。

44.BIO、NIO、AIO?

在这里插入图片描述
BIO(blocking I/O) : 就是传统的IO,同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过连接池机制改善(实现多个客户连接服务器)。

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4 以前的唯一选择,程序简单易理解。


NIO :全称 java non-blocking IO,是指 JDK 提供的新 API。从JDK1.4开始,Java 提供了一系列改进的输入/输出的新特性,被统称为NIO(即New IO)

NIO是同步非阻塞的,服务器端用一个线程处理多个连接,客户端发送的连接请求会注册到多路复用器上,多路复用器轮询到连接有IO请求就进行处理:

在这里插入图片描述
NIO的数据是面向缓冲区Buffer的,必须从Buffer中读取或写入。

可以看出,NIO的运行机制:

  • 每个Channel对应一个Buffer

  • Selector对应一个线程,一个线程对应多个Channel。

  • Selector会根据不同的事件,在各个通道上切换。

  • Buffer是内存块,底层是数据。


AIO:JDK 7 引入了 Asynchronous I/O,是异步不阻塞的 IO。在进行 I/O 编程中,常用到两种模式:Reactor 和 Proactor。Java 的 NIO 就是 Reactor,当有事件触发时,服务器端得到通知,进行相应的处理,完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用。

在这里插入图片描述


Linux IO模型和Java IO模型的对应关系:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

喜讯 | 宝兰德「应用服务器软件 V9.5」荣获“2024年度优秀软件产品”殊荣

近日,中国软件行业协会公布了“2024年度推广优秀软件产品”名单。经过专家委员会的评议及最终审核,宝兰德凭借领先的技术能力和丰富的经验积累,中间件核心产品「应用服务器软件 V9.5」获评“2024年度优秀软件产品”。 本次评选活动由中国软件…

基于SpringBoot的在线考试系统设计与实现

1.1 研究背景 21世纪,我国早在上世纪就已普及互联网信息,互联网对人们生活中带来了无限的便利。像大部分的企事业单位都有自己的系统,由从今传统的管理模式向互联网发展,如今开发自己的系统是理所当然的。那么开发在线考试系统意…

vscode【实用插件】Project Manager 项目管理

安装 在 vscode 插件市场的搜索 Project Manager点 安装 安装成功后,vscode 左侧栏会出现 使用 将项目添加到项目列表中 用 vscode 打开项目,点保存即可 将项目移出项目列表 切换项目 单击项目列表中的项目,即可切换到目标项目 新窗口打开…

道一云·七巧和金蝶云星空单据接口对接

道一云七巧和金蝶云星空单据接口对接 对接系统金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践,面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司,提供一个通用的ERP服务平台。K/3Cloud支持的协同应用包括但不…

淘宝霸屏必备工具:淘宝商品评论电商API接口

淘宝商品评论电商API接口是指用于获取淘宝商品评论信息的一种接口,通过该接口可以获取淘宝网上商品的评价内容、评价等级、评价数量等信息。通过了解并使用该接口,能够帮助电商了解消费者对商品的评价情况,做好商品的推广和销售工作。 接口使…

电脑提速秘籍:6款不可不知的Windows实用软件

6款Windows系统上不可或缺的高效工具,每一款都是小巧而强大的存在,让你的电脑使用更加流畅! 1.unlocker 当你遇到那些顽固的文件,需要管理员权限或者重启电脑才能删除时,这款只有1.02MB的轻量级工具可以帮你轻松解决问…

《黑神话悟空》战斗流派与技能加点指南及录屏技巧

在深入探索《黑神话悟空》的战斗艺术之前,让我们先来了解一些基本的战斗流派和技能加点策略,这将为你的西游之旅增添无限可能。不仅如此,我们还将介绍一款实用的录屏工具,让你能够轻松记录并分享你的冒险经历。现在,就…

水下生物检测系统源码分享

水下生物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

SAP B1 流程实操 - 营销单据采购部分(上)

背景 在 SAP B1 中,除开【销售】外超常用的模块就是【采购】,企业可能不涉及生产和库存(贸易公司),甚至不涉及采购(服务业),但是一定会有基本的 销售。本文中我们讲解 销售 模块的基…

Android Studio上传文件至GithubSVN的忽略文件配置

Android studio升级后,发现原本Github&SVN的忽略文件配置的地方在于找不到了 File -> Settings -> Editor -> File Types -> lgnored Files and Folders 除了原有的,还可以加入下面这些 *.hprof;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Stor…

5. 高阶函数

大型程序成本高昂,这不仅仅是因为构建程序需要花费时间。程序的大小几乎总是涉及复杂性,而复杂性会让程序员感到困惑。混乱的程序员反过来又会在程序中引入错误(bug)。大型程序则为这些错误提供了大量的隐藏空间,使它们…

如何在调试状态下部署局域网网站

1背景介绍 最近有开发数据统计的网站,老板需及时投放到显示屏,但程序仍需改动,只能先部署到局域网,测试产品不能部署服务器(服务器负担过重) 开发框架MVC4sql serverecharts,由于需每隔5分钟刷新,还有ajax…

vue3+vite+qiankun实现微应用

主应用 1、安装qiankun npm install qiankun2、在主应用中创建微应用的入口文件 src\views\micro\index.vue 这个文件主要是用来提供一个 DOM 节点挂载微应用 <template><div class"xin"><p>qiankun入口文档</p><div id"qiankun…

大语言模型水印

来源&#xff1a;ICML-2024 题目&#xff1a;Token-Specific Watermarking with Enhanced Detectability and Semantic Coherence for Large Language Models 参考文献格式&#xff1a;Huo, M., Somayajula, S.A., Liang, Y., Zhang, R., Koushanfar, F. &amp; Xie, P.. …

一文2000字从0到1详解requests接口自动化测试!

前言 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 1、理解什么是接口 接口一般来说有两种…

【JaveEE】——(手把手教你)用IDEA手搓一个定时器Timer

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;什么是定时器 二&#xff1a;IDEA中的定时器Timer 1&#xff1a;实例化Timer 2&#…

C语言-动态内存分配讲解

目录 ✨1.什么是动态内存分配 &#x1f495;2.动态内存开辟函数 malloc ✨3.malloc函数的检查&#xff08;两种方法&#xff09; &#x1f495;4.动态内存释放函数 free ✨5.free 函数接收空指针 ✨6.为什么要释放动态内存 &#x1f495;7.动态内存开辟函数calloc &#…

免杀笔记 ---> 一种有想法的Indirect-Syscall

今天来分享一下&#xff0c;看到的一种Indirect-Syscall&#xff0c;也是两年前的项目了&#xff0c;但是也是能学到思路&#xff0c;从中也是能感受到杀软对抗之间的乐趣&#xff01;&#xff01;说到乐趣&#xff0c;让我想起看到过一位大佬的文章对"游褒禅山记"的…

学习RocketMQ

RocketMQ是一个分布式消息和流平台&#xff0c;它被设计为具有简单和可复制的架构&#xff0c;同时具有高性能和高可靠性。以下是RocketMQ从入门到精通的一些关键概念和示例代码。 1、安装和启动RocketMQ 1.1、下载并解压RocketMQ二进制文件。 wget https://archive.apache.…

JavaWeb--08BeanUtils:自定义转换器

在07创建了表单&#xff0c;但是获取网页信息的java代码太繁杂了&#xff0c;每次获取数据都要书写依次如下的&#xff1a; 重新创建一个web工程项目test1010---需要配置tomacat&#xff0c;具体传送门&#xff1a;CSDN 配置好了如下&#xff1a; 在里面web目录下创建一个reg…