首页 > 编程语言 >[Java IO] 流原理及流的分类

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

时间:2024-07-13 20:57:05浏览次数:16  
标签:字符 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]流原理与分类的全部内容,感谢阅读!

标签:字符,Java,字节,写入,IO,数据,及流
From: https://blog.csdn.net/yuiezt/article/details/140405537

相关文章

  • 从零学习的JAVAday8~day14
    在安装eclipse时我们直接打开eclipse官网我们点击下载并安装到合适的位置即可。打开eclipse后我们就可以创建Java文件了然后再创建一个Java类,这样我们就可以在里面写我们第一个java代码了这就是我们的第一个代码,意思为输出“helloworld”。我们可以看到运行代码后输出了“he......
  • 学习java进度报告
    helloJava假期`已经过去一周了,也已经完全的放纵一周了,也该拾起学习大业了.看到了暑假生活指导,还是很有压力的,以前只觉得java和之前学的编程语言差不多.现在才知道程度区别很大,以前最多写写简单的编程题目,这次要掌握JAVAweb的前后台开发技术,甚至编写javaweb信息管理系......
  • Solution - Atcoder AGC021D Reversed LCS
    考虑到\(\operatorname{LCS}(T,T')\)这个形式实在是不太优美,考虑转化一下形式。感受一下,能够知道\(T\)的最长回文子序列\(|\operatorname{LPS}(T)|=|\operatorname{LCS}(T,T')|\)。具体证明可以见zhihu,本人暂时还没看懂。那么接下来对于单个串的\(\operatorname{LPS......
  • 光的反射与反射率 Reflection of Light and Reflectance/Reflectivity
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录光的反射ReflectionofLight一、光的反射ReflectionofLight二、反射的分类1.漫反射diffusereflection朗伯反射(Lambertianreflectance)关联概念参考文献2.镜面反射mirrorreflection3.回......
  • JavaScript的基础学习(一)
    从头开始学习JavaScript,重新开始打基础<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>......
  • C++11标准库<chrono>、<future>、 <atomic>、<condition_variable>、<mutex>、<t
    目录<chrono>时间间隔duration常用的duration时间点time_point时钟system_clock&steady_clocksystem_clock代码举例steady_clock(秒表)例程:转换函数1.duration_castDescription:duration支持隐式转换的规则2.time_point_cast<thread>this_thread命名空间1.get_id()2.sleep_f......
  • VMware workstation pro17虚拟机的安装|最新地址
    最近在学习Linux系统,需要下载VMwareworkstationpro17,由于VMware被收购,网传的大部分地址已经失效,分享一下最新地址,需要注册博通帐号即可:ProductDownloads-SupportPortal-Broadcomsupportportal安装过程参考:新手教程|2024年最新Vmware17安装教程及许可证(详细图......
  • 《JavaSE》------4.<基础语法(数据类型与变量)>
    包含java注释,标识符,关键字,数据类型与变量,Ascii码与Unicode码,类型转换....语言只是工具,不能决定你好不好找工作,决定你好不好找工作的是你的能力!!!!!学历本科及以上就够用了!!!!!!!!!!!!!!!!!!!!!!!!!!!!目录一、注释二、标识符三、关键字四、数据类型与变量4.1字面常量4.1.1字面常量的分类4.2数据......
  • 【JavaScript】聊一聊js中的浅拷贝与深拷贝与手写实现
    前言什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据复制操作的两种方式。‌在聊深浅拷贝之前咱得了解一下js中的两种数据类型:基本数据类型(6种)String、Number、Object、Boolean、null、undefined、symbol(ES6+)引用数据类型Object(function、Array、正则表达式等皆......
  • Java-static关键字详解
    目录1.static关键字的用途和作用用途作用2.在类中使用static修饰成员变量、方法和代码块修饰成员变量修饰方法修饰代码块修饰内部类3.常见误区误区1:静态变量在每个实例中都有一份误区2:静态方法可以访问实例变量和实例方法误区3:静态代码块在每次创建对......