详细了解IO分类

按照数据流方向如何划分?
  • 输入流(Input Stream):从源(如文件、网络等)读取数据到程序。

  • 输出流(Output Stream):将数据从程序写出到目的地(如文件、网络、控制台等)。

按处理数据单位如何划分?
  • 字节流(Byte Streams):以字节为单位读写数据,主要用于处理二进制数据,如音频、图像文件等。

  • 字符流(Character Streams):以字符为单位读写数据,主要用于处理文本数据

按功能如何划分?
  • 节点流(Node Streams):直接与数据源或目的地相连,如 FileInputStream、FileOutputStream。

  • 处理流(Processing Streams):对一个已存在的流进行包装,如缓冲流 BufferedInputStream、BufferedOutputStream。

  • 管道流(Piped Streams):用于线程之间的数据传输,如PipedInputStream、PipedOutputStream。

详细了解
  1. 按照流的方向(输入流和输出流)的区别

    • 输入流(InputStream/Reader)

      • 定义和功能:输入流主要用于从外部数据源(如文件、网络连接、内存缓冲区等)读取数据到程序中。它是数据进入程序的通道,就像水通过管道流入容器一样。例如,使用FileInputStream可以从文件中读取字节数据,BufferedReader可以从文件或其他字符输入源读取字符数据,并按行读取文本内容。

      • 使用场景:在读取本地文件内容、接收网络传输过来的数据(如 HTTP 请求中的数据)、解析配置文件等场景中经常使用。例如,读取一个文本文件中的用户配置信息,将数据读取到程序中进行后续的处理,如加载用户的偏好设置等。

    • 输出流(OutputStream/Writer)

      • 定义和功能:输出流的作用是将程序中的数据输出到外部目标(如文件、网络连接、打印机等)。它是数据从程序流出的通道,例如,FileOutputStream可以将字节数据写入文件,PrintWriter可以将字符数据(如格式化后的文本)输出到文件或者其他输出设备。

      • 使用场景:在保存程序运行结果到文件(如日志文件、数据备份文件)、向网络发送响应数据(如服务器向客户端发送 HTML 页面)等场景中发挥作用。比如,将程序运行过程中的错误信息记录到日志文件中,就需要使用输出流将错误信息写入日志文件。

  2. 按照操作单元(字节流和字符流)的区别

    • 字节流(InputStream/OutputStream)

      • 定义和操作单元:字节流以字节(8 位二进制数据)为基本操作单元,它可以处理任何类型的数据,因为所有的数据在底层存储和传输时最终都是以字节形式存在的。字节流可以直接操作文件、网络连接等底层资源,对数据进行逐个字节的读取或写入。例如,FileInputStreamFileOutputStream用于对文件进行字节级别的读写操作,适合处理二进制文件(如图像文件、音频文件、视频文件等),因为这些文件的内容是按照字节序列存储的。

      • 性能和适用范围:字节流在处理二进制数据时效率较高,因为它不需要进行字符编码和解码的转换。但对于文本数据的处理,如果涉及字符编码(如 UTF - 8、GBK 等),就需要开发人员自己手动处理编码相关的问题,相对比较复杂。字节流的通用性强,适用于所有类型的数据读写,但对于文本内容的操作不够直观。

    • 字符流(Reader/Writer)

      • 定义和操作单元:字符流以字符为基本操作单元,字符的大小和编码方式取决于具体的字符集。字符流在内部会根据选定的字符编码(如 UTF - 8)将字节转换为字符进行处理,更适合用于处理文本数据。例如,FileReaderFileWriter用于读取和写入文本文件,它们会自动按照默认或指定的字符编码将字节转换为字符或者将字符转换为字节。

      • 性能和适用范围:字符流在处理文本数据时更加方便,因为它自动处理了字符编码问题,开发人员可以直接操作字符,而不需要关心字节和字符之间的转换。但是,字符流在处理二进制数据时可能会出现问题,因为它会对数据进行字符编码转换,可能会破坏二进制数据的原始结构。字符流主要适用于处理文本文件(如.txt 文件、.java 文件等)、文本形式的网络数据(如 HTTP 响应中的 HTML 文本)等。

  3. 按照流的角色(节点流和处理流)的区别

    • 节点流(直接操作数据源的流)

      • 定义和数据源连接:节点流是直接连接到数据源(如文件、网络套接字等)或者目标(如文件、网络连接的接收端等)的流,它是数据读写的起点和终点。例如,FileInputStreamFileOutputStreamFileReaderFileWriter都是节点流,它们直接与文件进行连接,负责从文件读取数据或者将数据写入文件。

      • 功能特点:节点流提供了对数据源或目标最基本的读写功能,能够直接操作数据。但是,它们的功能可能相对比较单一,在一些复杂的场景下,如需要对数据进行缓冲、转换格式、加密等操作时,就需要和处理流结合使用。

    • 处理流(对流进行包装和处理的流)

      • 定义和对流的操作:处理流是对已存在的流(节点流或者其他处理流)进行包装和处理的流,它本身不直接连接数据源或目标,而是通过包装其他流来增强流的功能。例如,BufferedInputStreamBufferedOutputStream是对字节输入流和字节输出流进行缓冲处理的流,InputStreamReaderOutputStreamWriter是在字节流和字符流之间进行转换的处理流。

      • 功能特点:处理流可以提供多种附加功能,如缓冲(减少频繁的底层读写操作,提高性能)、数据转换(如字节流和字符流之间的转换)、数据加密 / 解密(通过包装加密算法对流中的数据进行处理)等。处理流可以层层嵌套,通过组合不同的处理流来实现复杂的功能,例如,可以先使用缓冲流对节点流进行缓冲,再使用转换流将字节流转换为字符流,最后使用加密流对数据进行加密。

    • 管道流(PipedInputStream 和 PipedOutputStream、PipedReader 和 PipedWriter)的基本概念

      • 管道流用于在两个线程之间进行通信,使得一个线程的输出可以作为另一个线程的输入。它就像一个管道,将数据从一端传递到另一端。在 Java 中,有字节管道流(PipedInputStream 和 PipedOutputStream)和字符管道流(PipedReader 和 PipedWriter),分别用于字节数据和字符数据的传输。

    • 管道流的工作原理

      • 连接机制:管道流必须先进行连接才能正常工作。对于字节管道流,通过PipedOutputStream.connect(PipedInputStream)方法或者在PipedInputStream的构造函数中传入PipedOutputStream来建立连接;对于字符管道流,通过PipedWriter.connect(PipedReader)方法或者在PipedReader的构造函数中传入PipedWriter来建立连接。

      • 数据传输过程:一旦连接成功,一个线程可以向PipedOutputStream(或PipedWriter)写入数据,另一个线程就可以从对应的PipedInputStream(或PipedReader)读取这些数据。写入的数据会被暂存在管道内部的缓冲区中,等待读取线程读取。例如,一个线程负责从网络接收数据并写入管道输出流,另一个线程从管道输入流读取数据并进行本地存储或其他处理。

    • 与其他流的区别

      • 使用场景不同:

        • 与普通的输入 / 输出流(如文件输入 / 输出流)不同,管道流主要用于线程间通信,而不是用于和外部设备(如文件、网络连接)进行数据交互。普通输入 / 输出流是针对数据源(如文件系统、网络等)进行数据读写,管道流则是在程序内部的线程之间传递数据。

        • 例如,在一个多线程的生产者 - 消费者模型中,如果生产者和消费者在同一个 JVM 进程中,就可以使用管道流来实现它们之间的数据传递。生产者线程生产的数据通过管道流发送给消费者线程,而不是将数据写入文件或网络再读取。

      • 数据流向和关联方式不同:

        • 管道流是成对出现且相互关联的,数据的流向是从输出端到输入端,并且这种流向是固定的。而其他流(如节点流和处理流)的数据流向取决于具体的操作(如从文件读取数据时,数据从文件流向程序;向文件写入数据时,数据从程序流向文件),并且它们之间的关联主要是通过包装(如处理流包装节点流)来实现功能的扩展,不是像管道流这样用于线程间的直接数据传输。

      • 数据存储和缓冲特点不同:

        • 管道流内部有一定的缓冲区来暂存数据,但这个缓冲区大小有限(默认是 1024 字节)。如果写入数据的速度超过读取数据的速度,缓冲区可能会满,此时写入线程会被阻塞;反之,如果读取数据的速度过快,缓冲区为空时,读取线程会被阻塞。与其他流相比,普通的输入 / 输出流在处理文件等数据源时,其缓冲机制可以通过缓冲流(如BufferedInputStreamBufferedOutputStream)等进行更灵活的配置和控制,而且一般不会因为数据的产生和消费速度不一致而出现与线程阻塞相关的问题(除非在多线程同时操作同一个流时没有正确处理同步)。

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

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

相关文章

Appium 安装问题汇总

好生气好生气,装了几天了, opencv4nodejs 和 mjpeg-consumer 就是装不了,气死我了不管了,等后面会装的时候再来完善,气死了气死了。 目录 前言 1、apkanalyzer.bat 2、opencv4nodejs 3、ffmpeg 4、mjpeg-consume…

目标检测知识点总结

1、数据增强 2、指标 3、vit 、swint ViT算法,创新性地将图像划分成一个个patch,并将每个patch展平为一个向量,使得图像数据转化为序列化数据,之后输入到Transformer模型中,实现了Transformer在图像分类任务中的应用。…

Lecture 11 - List,Set,Map

List, Set and Map are all interfaces: they define how these respective types work, but they don’t provide implementation code overview 1. List(列表): (1) 创建、访问和操作列表:ArrayList …

ElfBoard开源项目|基于百度智能云平台的车牌识别项目

本项目基于百度智能云平台,旨在利用其强大的OCR服务实现车牌号码的自动识别。选择百度智能云的原因是其高效的API接口和稳定的服务质量,能够帮助开发者快速实现车牌识别应用。 本项目使用摄像头捕捉图像后,通过集成百度OCR服务的API&#xf…

应对超声波测试挑战,如何选择合适的数字化仪?

一、数字化仪的超声波应用 超声波是频率大于人类听觉范围上限的声学声压(声学)波。超声波设备的工作频率为20 kHz至几千MHz。表1总结了一些更常见的超声波应用的特征。 每个应用中使用的频率范围都反映了实际情况下的平衡。提高工作频率可以通过提高分…

product/admin/list?page=0size=10field=jancodevalue=4562249292272

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService https://api.crossbiog.com/product/admin/list?page0&size10&fieldjancode&value45622492922721、ProductController GetMapping("ad…

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案,如需获取博物馆导览系统解决方案可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~撒花! 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中,博物馆作为文化传承和知…

Flink学习连载文章11--双流Join

双流 Join 和两个流合并是不一样的 两个流合并:两个流变为 1 个流 union connect 双流 join: 两个流 join,其实这两个流还是原来的,只是满足条件的数据会变为一个新的流。 可以结合 sql 语句中的 union 和 join 的区别。 在离线 Hive 中&…

vue3+wangeditor富文本编辑器详细教程

一、前言 在这篇教程中,我将指导如何使用 Vue 3 和 WangEditor 创建一个功能丰富的富文本编辑器。WangEditor 是一个轻量级的富文本编辑器,它非常适合集成到 Vue 项目中。这个例子展示了如何配置富文本编辑器,包括工具栏、编辑器配置以及如何…

Python学习39天

my_tools.py文件提供工具函数 """ 此文件编写工具函数,供程序员使用 my_tools """def read_confirm_select():"""让用户输入:Y/N,不区分大小写,将用户输入值转为小写返回&#xff…

LCA - Lowest Common Ancestor

LCA - Lowest Common Ancestor https://www.luogu.com.cn/problem/SP14932 题目描述 A tree is an undirected graph in which any two vertices are connected by exactly one simple path. In other words, any connected graph without cycles is a tree. - Wikipedia T…

unity打包web,发送post请求,获取地址栏参数,解决TypeError:s.replaceAll is not a function

发送post请求 public string url "http://XXXXXXXXX";// 请求数据public string postData "{\"user_id\": 1}";// Start is called before the first frame updatevoid Start(){// Post();StartCoroutine(PostRequestCoroutine(url, postData…

恒创科技:如何区分网站的域名主机名

如何区分网站的域名主机名?它们都是网址机制的一部分,当你在地址栏输入它们,就能访问互联网上想去的地方。你可曾思考过主机名和域名的区别呢? 简单来说,域名就像网址,而主机名用于标识网络中的设备。不过,这只是表面…

【技巧学习】ArcGIS如何计算水库库容量?

ArcGIS如何计算水库库容量? 一、数据获取 DEM数据来源于地理空间数据云,该网站是由中科院计算机网络信息中心于2008年创立的地学大数据平台。 二、填洼 将DEM数据中凹陷的区域填充至与倾斜点同样高度,这里的【Z限制】说的是设定一个特定的值&#x…

机器学习——感知机模型

文章目录 前言1.感知机模型介绍1.1基本概念1.2数学表达1.3几何解释1.4优缺点 2.二分类应用2.1应用介绍2.2准备数据集2.2.1环境检查2.2.2数据集介绍2.2.3获取数据2.2.4划分数据集 2.3可视化训练集2.4训练过程2.4.1首轮梯度下降2.4.2多轮梯度下降 2.5可视化分类结果2.6在验证集验…

11.20[JAVAEXP3]重定向细究【DEBUG】

设置了根域名访问为testServlet,让他重定向到首页为test.jsp,事实上也都触发了,但是最后显示的为什么不是test.jsp生成页面,依然还是index.jsp生成的页面?? 重定向是通过Dispatcher进行的,而不是sendRedir…

YOLOv11模型改进-注意力-引入卷积和注意力融合模块(CAFM) 提升小目标和遮挡检测

本篇文章将介绍一个新的改进机制——卷积和注意力融合模块CAFM,并阐述如何将其应用于YOLOv11中,显著提升模型性能。首先,CAFM是为了融合卷积神经网络(CNNs)和 Transformer 的优势,同时对全局和局部特征进行…

APM装机教程(五):测绘无人船

文章目录 前言一、元生惯导RTK使用二、元厚HXF260测深仪使用三、云卓H2pro遥控器四、海康威视摄像头 前言 船体:超维USV-M1000 飞控:pix6c mini 测深仪:元厚HXF160 RTK:元生惯导RTK 遥控器:云卓H12pro 摄像头&#xf…

基于MinIO打造高可靠分布式“本地”文件系统

MinIO是一款高性能的对象存储服务,而S3协议是由亚马逊Web服务(AWS)制定的一种标准协议,用于云存储服务之间的数据交换。MinIO与S3协议的关系在于,MinIO实现了S3协议的接口,这意味着用户可以使用与AWS S3相同…

Luma 视频生成 API 对接说明

Luma 视频生成 API 对接说明 随着 AI 的应用变广,各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多,从最初的写作,到医疗教育,再到现在的视频。 Luma 是一个专业高质量的视频生成平…