[Java IO] 流原理及流的分类

Java IO 流概念

Java IO(输入/输出)流是Java用于处理输入和输出操作的一种方式。
Java IO 系统主要基于流(Stream)的概念,流是一组有序的数据序列,可以是输入流(从数据源读取数据)或输出流(向数据目标写入数据)。


Java IO 流分类

  • 按操作数据单位不同分为:字节流(8bit)如二进制文件;字符流,如文本文件
  • 按数据流的流向不同分为:输入流;输出流
  • 按流的角色不同分为:节点流;处理流
(抽象基类)字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter
  1. Java的IO流共涉及40多个类,都是从上面的4个抽象类派生出来的;
  2. 这四个类派生出来的子类名称都是以父类名作为自身类名后缀。

关于输入流和输出流的区分

  • 输入流:数据从数据源(文件)到程序(内存)的路径。
  • 输出流:数据从程序(内存)到数据源(文件)的路径。
    在这里插入图片描述

字节流(Byte Streams)
字节流以字节为单位处理数据,适用于处理二进制数据(如图片、视频、音频等)。Java中字节流的基础类有两个:InputStream和OutputStream。

  • InputStream:是所有字节输入流的超类,用于读取数据。
  • OutputStream:是所有字节输出流的超类,用于写入数据。

字符流(Character Streams)
字符流以字符为单位处理数据,适用于处理文本数据。Java中字符流的基础类有两个:Reader和Writer。

  • Reader:是所有字符输入流的超类,用于读取文本数据。
  • Writer:是所有字符输出流的超类,用于写入文本数据。

常用IO流

字节流

  • FileInputStream 和 FileOutputStream:用于文件的字节读写。
  • BufferedInputStream 和 BufferedOutputStream:提供了带缓冲区的字节读写,提高了效率。
  • ByteArrayInputStream 和 ByteArrayOutputStream:用于处理字节数组的数据流。

字符流

  • FileReader 和 FileWriter:用于文件的字符读写。
  • BufferedReader 和 BufferedWriter:提供了带缓冲区的字符读写,提高了效率。
  • StringReader 和 StringWriter:用于处理字符串的数据流。

转换流

  • InputStreamReader 和 OutputStreamWriter:是字符流和字节流之间的桥梁,允许字符流以字节流的形式进行读写。

特殊用途流

  • PrintStream 和 PrintWriter:提供了打印功能的输出流,可以方便地输出各种类型的数据。
  • ObjectInputStream 和 ObjectOutputStream:用于对象的序列化和反序列化,即将对象写入文件或从文件中读取对象。

注意事项

  • 使用完流后,应关闭流以释放系统资源。可以使用try-with-resources语句自动管理资源。
  • 字节流和字符流在处理文本文件时,字符流更为方便,因为字符流会处理字符编码的转换问题。
  • 在进行大量数据的读写操作时,建议使用带缓冲区的流(如BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter),以提高效率。

在这里插入图片描述


节点流与处理流

节点流,可以从一个特定的数据源读写数据,如FileRreader、FileWriter。

  • 节点流是底层流,直接和数据源(如文件、内存区域、网络连接等)相连接。
  • 它提供了基本的读写功能,但功能相对简单,操作可能不够灵活或高效。
    在这里插入图片描述

处理流(也叫包装流),是“连接”在 已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,如 BufferedReader、BufferedWriter

  • 处理流不对数据源或目标直接操作,而是对已有的流进行包装,从而提供更高级别的功能。
  • 它通过消除不同节点流的实现差异,提供了一致的接口和更便捷的操作方法。
  • 处理流通常可以提高数据处理的效率,如通过缓冲来减少实际的读写次数。

处理流

节点流与处理流表格:在这里插入图片描述


Java IO流的应用场景

Java IO(输入/输出)流在Java编程中有着广泛的应用场景,主要用于处理数据的读取和写入操作。
以下是Java IO流的一些主要应用场景:

1. 文件读写

  • 读取文件:通过IO流可以读取文件中的数据,如配置文件、日志文件等。这包括使用FileInputStream、FileReader、BufferedReader等类来读取字节或字符数据。
  • 写入文件:通过IO流可以将数据写入文件,如生成报表文件、记录系统日志等。这包括使用FileOutputStream、FileWriter、BufferedWriter等类来写入字节或字符数据。

2. 网络通信

  • 数据传输:在网络编程中,IO流用于客户端与服务器之间的数据传输。例如,在Socket通信中,可以通过IO流发送和接收数据。
  • HTTP请求:在处理HTTP请求时,IO流用于读取请求数据(如表单数据、文件上传等)和写入响应数据。

3. 数据库操作

  • 数据备份与恢复:通过IO流,可以将数据库中的数据导出到文件中进行备份,或者从文件中读取数据来恢复数据库。
  • 数据迁移:在数据库迁移过程中,IO流用于在不同数据库系统之间传输数据。

4. 文本处理

  • 文本读取与写入:Java IO流提供了读取和写入文本文件的功能,使得文本处理变得简单高效。例如,可以使用FileReader和FileWriter类来处理文本文件。
  • 文本格式化:通过IO流,可以对文本数据进行格式化处理,如读取CSV文件、生成XML或JSON格式的数据等。

5. 图像处理

  • 图像读取与写入:虽然字节流(如FileInputStream和FileOutputStream)通常用于处理图像文件,但Java也提供了专门的图像处理库(如Java Image I/O API)来更高效地处理图像数据。然而,在底层,这些库仍然使用IO流来读取和写入图像文件。

6. 音视频处理

  • 音视频文件的读取与写入:类似于图像处理,音视频文件的处理也涉及到IO流的使用。虽然Java标准库中没有直接提供音视频处理的API,但可以通过第三方库(如JMF、Xuggler等)来实现,这些库在底层也会使用IO流来读取和写入音视频数据。

7. 数据加密与解密

  • 数据加密:在需要将敏感数据进行加密存储或传输时,可以使用IO流配合加密算法来实现。例如,可以使用CipherOutputStream来加密数据,并将其写入文件或通过网络发送。
  • 数据解密:相应地,也可以使用CipherInputStream来解密接收到的加密数据。

8. 串口通信

  • 与硬件设备的通信:在嵌入式系统或需要与硬件设备(如传感器、执行器等)进行通信的应用程序中,IO流也扮演着重要角色。虽然Java标准库中没有直接提供串口通信的API,但可以通过第三方库(如RXTX、jSerialComm等)来实现。

9. 内存操作

  • 内存映射文件:Java的FileChannel类提供了内存映射文件的功能,这允许将文件的一部分或全部内容映射到内存中,从而可以通过访问内存来访问文件内容。这实际上也是IO流的一种应用形式。

10. 流式计算

  • 日志分析:在处理大量日志数据时,可以使用IO流来逐行读取日志文件,并进行实时分析处理。
    实时数据处理:在需要实时处理数据流的应用程序中(如实时监控系统、在线数据分析等),IO流也是不可或缺的一部分。

以上就是[Java IO]流原理与分类的全部内容,感谢阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DP(4) | 0-1背包 | Java | LeetCode 1049, 494, 474 做题总结

1049. 最后一块石头的重量 II 和 LC 416.分割等和子集 类似 思路(我没有思路): 两块石头相撞,这里没有想到的一个点是,相撞的两个石头要几乎相似 以示例1为例,stones [2,7,4,1,8,1],如果从左到…

【学习笔记】虚幻SkeletalMesh学习(一)基础介绍

文章目录 零、前言一、资源介绍1.1 骨架资源1.2 骨架网格体资源 二、UE4中的定义2.1 骨骼数据2.2 模型网格数据 三、渲染3.1 RenderData的初始化3.2 渲染对象的创建3.3 渲染对象的更新3.3.1 游戏线程的更新(*FSkeletalMeshObjectGPUSkin::Update*)3.3.2 …

java 发送企业域名邮箱消息

目录 通过域名注册邮箱准备添加用户登录 通过java发送企业邮件pom.xml发送代码 企业为了推广本公司的知名度,系统注册邮箱时,发送验证码得邮箱,需要以域名为后缀 通过域名注册邮箱 首选拥有一个企业域名,本文默认大家都有域名 准…

浏览器缓存:强缓存与协商缓存实现原理有哪些?

1、强缓存:设置缓存时间的,那么在这个时间内浏览器向服务器发送请求更新数据,但是服务器会让其从缓存中获取数据。 可参考:彻底弄懂强缓存与协商缓存 - 简书 2、协商缓存每次都会向浏览器询问,那么是怎么询问的呢&…

家用美容仪维修图片记录

家用美容仪维修过程记录,宙斯,上图

JavaEE初阶-网络原理2

文章目录 前言一、TCP报头结构二、TCP的十个核心机制2.1 确认应答2.2 超时重传2.3 连接管理2.3.1 建立连接:三次握手2.3.2 断开连接:四次挥手. 2.4 滑动窗口2.5 流量控制2.6 拥塞控制2.7 延时应答2.8 捎带应答2.9 面向字节流2.10 异常情况2.11 补充 前言…

Java(二十)---双向链表

文章目录 前言1.为什么学习双向链表2.双向链表(LinkedList)的模拟实现2.1. 准备工作2.2.功能的实现2.2.1.显示链表(display) 和 是否包含某种元素(contains) 以及 获取链表节点个数(size())2.2.2.头插法(addFirst),尾插法(addLast),以及在指定位置进行插…

鸿蒙语言基础类库:【@system.brightness (屏幕亮度)】

屏幕亮度 说明: 从API Version 7 开始,该接口不再维护,推荐使用新接口[ohos.brightness]。本模块首批接口从API version 3开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import brightness from sy…

基于SpringBoot+VueJS+微信小程序技术的图书森林共享小程序设计与实现:7000字论文+源代码参考

博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…

ZBrush入门使用介绍——2、GoZ使用

大家好,我是阿赵。   这里介绍一下ZBrush的GoZ功能。 一、 GoZ工具的作用 GoZ工具,是一个可以把ZBrush里面的模型发送到别的软件,还有可以从别的软件把模型发送到ZBrush的工具。   暂时,GoZ支持Cinema4D、3D Studio Max、May…

Go Web开发框架之Gin

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

代码规范性

代码规范性 命名规范代码格式注释代码结构异常处理代码复用代码审查空格的用法代码示例 命名规范 ​ 1、变量和函数名:使用驼峰命名法(camelCase),如userName、getUserInfo。 ​ 2、常量:使用全大写字母,…

CompletableFuture异步编排

1.创建异步对象 CompletableFuture提供了四个静态方法来创建一个异步操作 public static ExecutorService executor Executors.newFixedThreadPool(10);public static void main(String[] args) throws ExecutionException, InterruptedException {System.out.println("…

mwwz库支持可视化每个特征点的匹配质量

支持获取每个特征点的匹配分数,同时支持擦除特征点。

数据库第6次作业

内容 1、创建视图v_emp_dept_id_1,查询销售部门的员工姓名和家庭住址 2、创建视图v_emp_dept,查询销售部门员工姓名和家庭住址及部门名称。 3、创建视图v_dept_emp_count(dept_name,emp_count,avg_salay),统计每个部门人数并计算平均工资。 …

【Datawhale AI夏令营】电力需求预测挑战赛 Task02

task02 Task2 版本教程将使用机器学习模型解决本次问题,模型使用简单,数据不需要过多预处理; 使用机器学习方法一般主要需要从 获取数据&增强、特征提取和模型 三个方面下手。 使用机器学习方法有哪几个步骤? 一般的使用机器…

摄像头 RN6752v1 视频采集卡

摄像头 AHD倒车摄像头比较好,AHD英文全名Analog High Definition,即模拟高清,拥有比较好的分辨率与画面质感。 RN6752v1 GQW AKKY2 usb 采集卡 FHD(1080p)、HD(720p)和D1(480i&am…

局域网内放开端口

欢迎使用Markdown编辑器 点击完成后,其他内网机器就可以访问了。

ICT产业是什么?具体是干什么

前言: ICT产业,即信息与通信技术产业(Information and Communication Technology),是一个涵盖了广泛技术和服务的综合产业。它主要包括计算机硬件、软件、网络和电信设备等领域。 ICT是由信息通信和技术的英文单词首…

Linux 内核模块加载知多少

文章目录 目录 1. 内核模块 内核模块的作用 2. 内核模块的加载 2.1 内核模块的加载过程 2.2 内核模块加载方式 使用 insmod 加载模块 使用 modprobe 加载模块 2.3 内核模块加载顺序 3. 常用的相关命令 4. 总结 工作还在继续,学习还在继续,学习…