对IO流原理及、分类及IO模型的一个大概认识【Java基础题】

1.流的分类

  • 根据操作数据单位分类:

    • 字节流
    • 字符流

        一般来说,字符流会比字节流效率更高,因为1个字符一般比1个字节(8bit)大(it depends on 具体的编码规则,例如UTF-8中1个中文等于3个字节,1个英文等于1个字节)。可以理解为一个工人一次可以搬的东西更多,则效率更高。但是,它们的应用场景不同,使用字节流来操作二进制的文件(例如图片、视频等)可以保证对文件的无损操作。而字符流就天然地更适合文本文件

  • 根据数据流的流向分类:

    • 输入流
    • 输出流

        输入、输出是以JAVA程序(运行时内存)的角度来定义的,从外部数据源(硬盘或网络传输等外部数据源)传输到JAVA程序是输入,从JAVA程序传输到外部是输出。

        字节流根据输入输出又分为字节输入流,字节输出流。

        字节输入流的抽象基类是InputStream、字节输出流的抽象基类是OutputStream

        字符流根据输入输出又分为字符输入流,字符输出流。

        字符输入流的抽象基类是Reader、字符输出流的抽象基类是Writer

        这些抽象基类是不能被直接实例化的,只能用相应的子类来实例化对象。

(1)JAVA中IO流总共涉及40多个类,但是都是由:InputStream、Outputstream、Reader、Writer这四个抽象基类派生的

(2)由上述四种类派生出来的子类名称都是以其父类名作为其名称后缀。

JAVA IO体系图参考:Java的IO流体系-CSDN博客

  • 根据流的角色分类:

    • 节点流 Node Stream
    • 处理流/包装流 

节点流是可以从特定的数据源读写数据。是比较底层的流,因为它门是直接连接、操作数据源的,没有过多的处理和包装。包装流(处理流);对节点流进行包装,使它功能更加强大,既可以消除不同节点流的实现差异,也可以提供更方便的方法完成输入输出。

例如:BufferedReader继承Reader,它有一个Reader类型的成员变量in,这个in可以是Reader的任何子类,也就是BufferedReader是对这个节点流进行了一个封装。这里的设计模式属于修饰器模式。

处理流的功能主要主要体现在以下两个方面:

1.性能的提高:主要是以增加缓存的方式来提高输入输出的效率。

缓冲流的工作原理是预先从数据源读取数据存入内部缓冲区,或将输出数据暂存到内部缓冲区,直到缓冲区满了再一次性写入目的地。这样减少了与物理读写设备的交互次数,因为访问磁盘或网络资源通常比访问内存慢得多。缓冲流自动管理缓冲区,开发者不需要关心缓冲区的具体操作细节。

Java提供了四个主要的缓冲流类,分别用于不同的输入输出流:

  1. BufferedInputStreamBufferedOutputStream:用于增加缓冲功能的字节流。它们分别包装任何类型的InputStreamOutputStream,提供了缓冲的读写能力。

  2. BufferedReaderBufferedWriter:用于增加缓冲功能的字符流。它们分别包装任何类型的ReaderWriter,同样提供了缓冲的读写能力。

2.操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便。

其他节点流

  • 对象流ObjectInputStreamObjectOutputStream 能够将基本数据类型和对象进行序列化(以指定的格式写入文件,非文本,dat后缀)和反序列化(读取到程序内存中),传入对象流中的对象一定要实现序列化Serializable接口,否则就会报NotSerializableException。要注意的是write和read的顺序要一一对应。序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员。
  • 标准输入输出
    • System.in 标准输入  它的编译类型是 InputStream 它的运行类型是BufferedInputStream 默认设备是键盘
    • System.out 标准输出 它的编译类型是 PrintStream 运行时类型是 PrintStream  默认设备是屏幕
  • 转换流:InputStreamReader、OutputStreamWriter---->用于将字节流转换成字符流,可用于解决中文乱码问题
  • 打印流:打印流只有输出流没有输入流,PrintStream、PrintWriter

2.文件与流之间的关系

流是文件(数据)的通道

创建流对象和指定的文件关联起来后,就用这个流对象操作文件

相关的类:

1.FileInputStream 构造方法是需要与实际的文件或者File对象相关联起来(也就是一个FileInputStream对应一个文件?)

在Java中,FileInputStream是用于从文件中读取数据的一种输入流。当你创建一个FileInputStream实例时,你必须指定一个文件源,这可以是一个文件路径的字符串,也可以是一个File对象。如果指定的文件不存在,构造FileInputStream时会抛出一个FileNotFoundException,这意味着在创建流对象之前,必须确保文件确实存在且对当前程序可读。

每个FileInputStream流对象和一个具体的文件是一对一对应的。这意味着流对象是专门为了从一个特定的文件中读取数据而打开的,它与那个文件绑定在一起。如果你需要从另一个文件读取数据,就必须创建一个新的FileInputStream对象来指向新的文件。

这种设计反映了流(Stream)的概念:流是一次性的、有方向的数据序列,它们连接程序和数据源或数据目标。在文件IO中,数据源或目标就是特定的文件。一旦流与数据源或目标建立了连接,它就只能用于那个特定的数据源或目标。如果要处理另一个文件,就需要开启一个新的流。

这不仅适用于FileInputStream,还适用于Java中的其他类型的流,如FileOutputStream(用于写文件)、ObjectInputStreamObjectOutputStream(用于读写对象)等。每次使用这些流时,都需要为它们指定一个具体的数据源或目标

举个例子,如果你先后需要从两个不同的文件中读取数据,你需要为每个文件创建各自的FileInputStream对象

2.FileOutputStream  

3.FileReader 继承的是--->InputStreamReader--->Reader

4.FileWriter 继承的是--->OutputStreamWriter--->Writer

FileWriter调用write方法,要close或者flush才能写到指定的文件?为什么?

Write只是写到FileWriter对象,最后close才会保存到磁盘。FileWriter的底层是用的FileOutputStream,最终要写到磁盘用的是FileOutputStream的Write

其他具体的细节内容需要在后面的文章中拓展。 

3.什么是IO模型?BIO NIO AIO?

IO模型:IO模型决定了数据如何在应用程序和网络间传输。IO模型是系统底层的支持,不同语言和框架对这些模型的支持和实现方式可能会有所不同。虽然IO模型最初是针对网络IO操作来描述的,但它们的基本原则和方法同样适用于本地IO操作。

BIO:BlockingIO,传统IO模型,同步阻塞IO--->可以大概对应的实现是java中java.io包

应用程序执行IO操作时,如果数据未准备好,它将一直等待数据准备完毕。一旦数据准备好了,再将数据从内核空间拷贝到用户空间,此过程中应用程序是阻塞的。

每个请求都需要在处理过程中阻塞等待。(比如socket在服务端一般是while(ture){server.accept()},没有接收到数据的时候,这个线程就会一直停在这里)

这意味着如果要同时处理多个请求,就需要为每个请求分配一个线程,随着请求数量的增加,线程数量也会相应增长,这在并发量较高时会占用大量的系统资源。

NIO:Non-BlockingIO,同步非阻塞IO--->可以大概对应的实现是java中java.nio包

应用程序执行IO操作时,如果数据未准备好,它不会等待数据准备完毕,而是直接返回一个错误码。应用程序可以继续做其他事情,但需要不断地检查数据是否准备好。

可以让你进行非阻塞的IO操作。核心组成部分包括Buffers(缓冲区)Channels(通道)Selectors(选择器)等。NIO允许单个线程管理多个IO操作。如果在非阻塞模式下没有IO操作可用,线程可以进行其他任务,而不是阻塞等待,从而提高了资源利用率。Java中的java.nio包提供了NIO功能,核心类包括ByteBufferCharBufferSelectorServerSocketChannelSocketChannel等。

AIO:  AsynchronousIO,异步非阻塞IO--->可以大概对应的实现是java中java.nio.channels中的异步类

应用程序发起IO操作后可以直接进行其他任务,当IO操作完成后,系统会通知应用程序IO操作已经完成。

AIO适用于连接数较多且连接时间较长的应用,Java中的java.nio.channels.AsynchronousFileChanneljava.nio.channels.AsynchronousSocketChannel是AIO模型的两个例子。

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

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

相关文章

物联网数据驾驶舱

在信息化时代,数据已经成为驱动企业发展的核心动力。特别是在物联网领域,海量数据的实时采集、分析和监控,对于企业的运营决策和业务优化具有至关重要的作用。HiWoo Cloud作为领先的物联网云平台,其数据监控功能以“物联网数据驾驶…

UE C++ 相机视口变换(World与相机互转)

UE C 相机视口变换(World与相机互转) UFUNCTION(BlueprintCallable, BlueprintPure) static void ProjectSceneCaptureToWorld(const class USceneCaptureComponent2D* SceneCaptureComponent2D,const FVector2D& SceneCapturePosition, FVector&am…

Docker常见指令

1.docker search mysql :从docker镜像仓库搜索和mysql有关的镜像 docker search mysql 2.docker pull mysql :从docker仓库拉取mysql镜像 docker pull mysql 3.docker run mysql :启动mysql镜像 docker run mysql 4.docker ps &#xff…

【通信原理笔记】【二】随机信号分析——2.4 复随机过程

文章目录 前言一、复随机过程1.1定义1.2 复平稳过程 二、平稳带通过程分析2.1 解析过程2.2 随机过程的复包络 三、平稳序列与循环平稳总结 前言 目前为止,我们对实随机过程的分析方法已经基本掌握了。像复信号一样,我们也会有需要处理复随机过程的时候&…

工业母机5G智能制造工厂数字孪生可视化平台,推进行业数字化转型

随着科技的不断进步和工业的快速发展,数字化转型已成为工业领域的重要趋势。工业母机作为制造业的核心设备,其智能化、自动化水平的提升对于整个工业的发展具有重要意义。5G技术的广泛应用,为智能制造工厂提供了更为可靠、高速的网络连接&…

OSError: We couldn‘t connect to ‘https://huggingface.co‘ to load this file

想折腾bert的同学,应该也遇到这个问题。 一、报错信息分析 完整报错信息:OSError: We couldnt connect to https://huggingface.co to load this file, couldnt find it in the cached files and it looks like google/mt5-small is not the path to a…

力扣刷题Days20-151. 反转字符串中的单词(js)

目录 1,题目 2,代码 1,利用js函数 2,双指针 3,双指针加队列 3,学习与总结 1,正则表达式 / \s /: 2,结合使用 split 和正则表达式: 1,题目 给你一个字符串 s &am…

Docker学习之使用harbor搭建私有仓库(超详解析)

实验目的: 使用centos7,基于harbor构建私有仓库 实验步骤: 下载相关安装包和依赖: [rootlocalhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 wget //安装docker所需要的相关依赖 [rootlocalhost ~]#…

PaddleOCR识别框架解读[14] OCR数据集

文章目录 1. 文本检测1.1 PaddleOCR 文字检测数据格式1.2 公开数据集1.2.1 ICDAR 20152. 文本识别2.1 PaddleOCR 文字识别数据格式2.2 公开数据集2.2.1 ICDAR 20153. 数据存放路径这里整理了OCR中常用的公开数据集,持续更新中,欢迎各位小伙伴贡献数据集~ 1. 文本检测 1.1 P…

山景BP1048 升级狗烧写

1.打开MVAssistant_BP10xx工具,在芯片型号栏中选择B1X系列。 2.模式选择 选 M2.仅升级Flash SH(可选) 3 .Code数据选择SDK编译好的bin文件 4.const数据选择编译好的提示音bin文件。 5.点击升级狗下载。 6. 如下图所示,出现提示为正在给升级狗正在下载程…

git pull 报错: 在签出前,请清理存储库工作树

问题: 使用vscode 用git 拉取代码,提示:在签出前,请清理存储库工作树** 原因: git仓库上的代码和本地代码存在冲突了所以会报这个报错。 解决办法: ①git stash 先将本地修改存储起来 ②git pull 拉取远…

创新应用2:nnmf+DBO+K-Medoids聚类,蜣螂优化算法DBO优化K-Medoids,适合学习和发paper。

创新应用2:nnmfDBOK-Medoids聚类,蜣螂优化算法DBO优化K-Medoids,适合学习和发paper。 一、蜣螂优化算法 摘要:受蜣螂滚球、跳舞、觅食、偷窃和繁殖等行为的启发,提出了一种新的基于种群的优化算法(Dung Beetle Optim…

多个图片怎么变成一张动图?一个方法在线操作

如何将图片变成gif动画?gif动图文件体积、画面丰富兼容性也比较高。通过多张静图就能够制作一张gif动画,能够自己制作生动有趣的gif动态图片能更好的传达信息。只需要使用在线图片合成(https://www.gif.cn/)工具,上传j…

【C语言基础】:字符函数和字符串函数

文章目录 一、字符函数1. 字符分类函数2. 字符转化函数 二、字符串函数1. strlen函数的使用和模拟实现strlen函数的使用strlen函数的模拟实现 2. strcpy函数的使用和模拟实现strcpy函数的使用strcpy函数的模拟实现 3. strcat函数的使用和模拟实现strcat函数的使用strcat函数的模…

el-table树形数据序号排序处理

1&#xff0c;用下面这个代码可以实现基本表格的序号排序 <el-table-column label"序号" width"50px" align"center"><template slot-scope"scope">{{ scope.$index 1 }}</template></el-table-column>2&…

【LeetCode热题100】104. 二叉树的最大深度(二叉树)

一.题目要求 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&am…

训练数据集(一):真实场景下采集的煤矸石目标检测数据集,可直接用于YOLOv5/v6/v7/v8训练

文章目录 数据集介绍数据集训练精度展示数据集获取方式 数据集介绍 煤矸石训练数据集&#xff1a;891张&#xff1b;验证数据数据集&#xff1a;404张 数据集类别&#xff1a;0代表煤炭&#xff08;coal&#xff09;&#xff0c;1代表矸石&#xff08;gangue&#xff09;&…

Git reset命令后如何恢复到最新版本

文章目录 Git reset命令后如何恢复到最新版本使用git reflog命令使用git checkout命令 总结 Git reset命令后如何恢复到最新版本 Git reset命令后&#xff0c;可以使用以下两种方法恢复到最新版本&#xff1a; 使用git reflog命令 git reflog该命令可以查看所有Git操作的记录…

【C语言】比较两个字符串大小,strcmp函数

目录 一&#xff0c;strcmp函数 1&#xff0c;strcmp函数 2&#xff0c;函数头文件&#xff1a; 3&#xff0c;函数原型&#xff1a; 4&#xff0c;返回取值&#xff1a; 二&#xff0c;代码实现 三&#xff0c;小结 一&#xff0c;strcmp函数 1&#xff0c;strcmp函数 …

docxTemplater——从word模板生成docx文件

官网文档&#xff1a;Get Started (Browser) | docxtemplater 官网在线演示&#xff1a;Demo of Docxtemplater with all modules active | docxtemplater 源码&#xff1a;https://github.com/open-xml-templating/docxtemplater 不仅可以处理word&#xff08;免费&#xf…