Java I/O 的 OutputStream 输出流相关知识点详解

news2025/6/25 22:34:11

Java 17 的 I/O 基础 OutputStream 篇

对于 OutputStream 主要是字节流类型的输出流。

OutputStream

OutputStream 抽象类是所有字节输出流类的超类。输出流接受输出字节并将它们发送到某个接收器中。 同样该抽象类需要一个子类来继承实现始终提供至少一种写入一个字节输出的方法。

该类的定义:

public abstract class OutputStream implements Closeable, Flushable

抽象类中的方法包括:

从本篇开始尽量使用表格而不使用图片,因为我发现复看我的文章的时候,图片的清晰度真不能看。

因为是抽象类,并不能真正的进行操作,只有子类才能执行,接下来我们来看看子类具体实现。

子类实现

ByteArrayOutputStream

这个类实现了一个输出流,其中数据被写入一个字节数组。 缓冲区会随着数据写入而自动增长。 可以使用 toByteArray() 和 toString() 检索数据。 关闭 ByteArrayOutputStream 无效。 可以在流关闭后调用此类中的方法,而不会生成 IOException。

定义:

public class ByteArrayOutputStream extends OutputStream

方法的定义:

演示使用小例子

try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
for (byte i = 0; i < 10; i++) {
byteArrayOutputStream.write(i);
}

System.out.println("byteArrayOutputStream.size(): " + byteArrayOutputStream.size());

byte[] array = byteArrayOutputStream.toByteArray();
for (byte b : array) {
System.out.print(b + "\t");
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}

完整代码及运行

FileOutputStream

文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。文件是否可用或是否可以创建取决于底层平台。特别是某些平台,一次只允许一个 FileOutputStream(或其他文件写入对象)打开一个文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。 FileOutputStream 用于写入原始字节流,例如图像数据。要写入字符流,请考虑使用 FileWriter。

定义:

public class FileOutputStream extends OutputStream

该类的构造函数:

对于子类的方法, 除了父类的方法外,又新增了两个方法。新增方法如下:

并重写了 close, write的三个方法。

查看代码:

String content = "把该段内容写入到文件系统中。";
byte[] bytes = content.getBytes();
try (FileOutputStream fileOutputStream = new FileOutputStream("file.txt")) {
fileOutputStream.write(bytes);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}

演示案例:

这里需要注意的是,文件的写入默认使用和系统相关的字符集, 我这是中文的系统,默认情况下是 GBK 的字符集体系。所以要看你的情况来选择, 后续写到 Writer 之后,在说字符集转换的问题。还有 cat 命令。这个命令只有在 PowerShell 的命令行工具中存在,cmd 命令行中并没有该指令。

另外的使用方式如下:

new FileOutputStream(new File("file.txt"));
new FileOutputStream(new File("file.txt"), true);
new FileOutputStream("file.txt", true)

完整代码如下:

运行效果,后面两个都是追加数据的意思,保留原先的数据写入:

FilterOutputStream

这个类是过滤输出流的所有类的超类。 这些流位于已经存在的输出流(底层输出流)之上,它用作其基本数据接收器,但可能会沿途转换数据或提供附加功能。 FilterOutputStream 类本身只是简单地使用将所有请求传递到底层输出流的版本覆盖了 OutputStream 的所有方法。 FilterOutputStream 的子类可能会进一步覆盖其中一些方法,并提供额外的封装方法和需要的字段。

定义:

public class FilterOutputStream extends OutputStream

该类只有一个构造函数,构造方法为:

查看代码案例:

String content = "使用 FilterOutputStream 把该段内容写入到文件系统中。";
byte[] bytes = content.getBytes();
try (FileOutputStream fileOutputStream = new FileOutputStream("file.txt");
FilterOutputStream filterOutputStream = new FilterOutputStream(fileOutputStream)) {
filterOutputStream.write(bytes);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}

完整代码及运行效果:

ObjectOutputStream

ObjectOutputStream 将 Java 对象的原始数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。对象的持久存储可以通过使用流的文件来实现。如果流是网络套接字流,则可以在另一个主机或另一个进程中重构对象。

只有支持 java.io.Serializable 接口的对象才能写入流。每个可序列化对象的类都经过编码,包括类的类名和签名、对象的字段和数组的值,以及从初始对象引用的任何其他对象的闭包。 writeObject 方法用于将对象写入流。任何对象,包括字符串和数组,都是用 writeObject 编写的。可以将多个对象或原语写入流。对象必须从相应的 ObjectInputstream 以与写入时相同的类型和相同的顺序读回。

定义为:

public class ObjectOutputStream
extends OutputStream implements ObjectOutput, ObjectStreamConstants

对应的构造方法如下:

直接代码演示:

可以使用 ObjectInputStream 输入流读取对应的序列化内容。

常用的 write 方法

代码:

String str = "使用序列化进行字符串的写入";
try(FileOutputStream fileOutputStream = new FileOutputStream("string.tmp");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream)) {
objectOutputStream.writeObject(str);
objectOutputStream.writeByte(100);
objectOutputStream.writeChar(200);
objectOutputStream.writeInt(300);
objectOutputStream.writeShort(10);
objectOutputStream.writeFloat(0.111f);
objectOutputStream.writeDouble(1.11d);
objectOutputStream.writeLong(400L);
objectOutputStream.writeBoolean(true);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}

PipedOutputStream

管道输出流可以连接到管道输入流以创建通信管道。 管道输出流是管道的发送端。 通常,数据由一个线程写入 PipedOutputStream 对象,数据由其他线程从连接的 PipedInputStream 读取。 不建议尝试从单个线程中使用这两个对象,因为它可能会使线程死锁。 如果从连接的管道输入流中读取数据字节的线程不再活动,则称该管道已损坏。

定义:

public class PipedOutputStream extends OutputStream

构造函数

使用例子:

BufferedOutputStream

该类实现了一个缓冲的输出流。 通过设置这样的输出流,应用程序可以将字节写入底层输出流,而不必为每个写入的字节调用底层系统。

定义:

public class BufferedOutputStream extends FilterOutputStream

构造函数:

代码示例:

CheckedOutputStream

一个输出流,它还维护正在写入的数据的校验和。 然后可以使用校验和来验证输出数据的完整性。

定义:

public class CheckedOutputStream extends FilterOutputStream

同样只有一个构造函数

方法有一个父类没有的方法 getChecksum() 意思是:返回此输出流的校验和。

演示代码:

try (FileOutputStream fos = new FileOutputStream("file.txt");
CheckedOutputStream check = new CheckedOutputStream(fos, new CRC32());) {
String content = "这个是 CheckedOutputStream 写入的内容";
byte[] array = content.getBytes();
for (byte b : array) {
check.write(b);
}
long ckSum = check.getChecksum().getValue();
System.out.println("Checksum: 0x" + Long.toHexString(ckSum).toUpperCase());

} catch (IOException ex) {
System.out.println(ex.getMessage());
}

完整代码和运行效果:

使用工具校验一下 CRC32 的校验码是否一致。

CipherOutputStream 不在演示,在加密和解密知识点在来详细说这个。

DataOutputStream

数据输出流允许应用程序以可移植的方式将原始 Java 数据类型写入输出流。 然后,应用程序可以使用数据输入流来读回数据。 多个并发线程使用 DataOutputStream 是不安全的。 如果一个 DataOutputStream 被多个线程使用,那么对数据输出流的访问应该由适当的同步控制。

定义:

public class DataOutputStream extends FilterOutputStream implements DataOutput

代码演示效果:

try (FileOutputStream fileOutputStream = new FileOutputStream("file.txt");
DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream)) {
String content = "这个是 DataOutputStream 的演示";
byte[] array = content.getBytes();
for (byte b : array) {
dataOutputStream.write(b);
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}

对于 DeflaterOutputStream 和 InflaterOutputStream 是压缩和解压的输出流。这里先不做演示。

PrintStream

PrintStream 向另一个输出流添加了功能,即能够方便地打印各种数据值的表示形式。

还提供了另外两个功能。与其他输出流不同,PrintStream 从不抛出 IOException;相反,异常情况只是设置一个内部标志,可以通过 checkError 方法进行测试。

也可以可选的创建一个 PrintStream 以便自动刷新;这意味着在写入字节数组、调用 println 方法之一或写入换行符或字节 ('\n') 后,会自动调用底层输出流的 flush 方法。

PrintStream 打印的所有字符都使用给定的编码或字符集转换为字节,如果未指定,则使用平台的默认字符编码。 PrintWriter 类应该用于需要写入字符而不是字节的情况。 这个类总是用字符集的默认替换字符串替换格式错误和不可映射的字符序列。

当需要对编码过程进行更多控制时,应使用 CharsetEncoder 类。

演示代码:

这里来看我们经常用到的一个使用方法。

System.out.println("输出一串字符串。");

该类是 System

java.lang.System
public final class System

里面有个静态的常量方法 out 返回值是: PrintStream。 然后就可以理解为什么可以打印字符串了。

所以 System.out.println(""); 基本等同于 new PrintStream("file.txt").println(""); 区别是一个输出到了控制台, 一个输出到了文件中。 这也是以后在 web 开发中使用 System.out 打印信息的时候, 其实也会写到日志文件中一样。

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

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

相关文章

【UnityUGUI】复合控件详解,你还记得多少

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;UI_…

MQ-小试牛刀

MQ MQ解决了什么问题&#xff1f; 异步处理 解耦合 削峰填谷 大规模数据处理 解耦 A系统发送数据到BCD三个系统&#xff0c;通过接口调用发送。如果 E 系统也要这个数据呢&#xff1f;那如果C系统现在不需要了呢&#xff1f;A系统负责人几乎崩溃… A系统跟其它各种乱七…

三个角度分解永磁同步电机发电工况

永磁同步电机的工作根据电压电流的方向可以分为四种状态&#xff1a; 其中电动工况容易理解&#xff0c;逆变器将母线的直流电转化为交流电&#xff0c;驱动三相逆变电桥的占空比越大输出交流电压越高&#xff0c;电机转速越高。 但是发电工况则没那么容易理解&#xff0c;即…

Macos必备ps 磨皮滤镜插件

想要快速提升人像修图效果&#xff0c;让皮肤看起来更加光滑细腻吗&#xff1f;那么你可以尝试使用ps磨皮滤镜插件。这些插件能够让你在短时间内快速有效地进行人像处理&#xff0c;无论是对于专业的设计师还是初学者来说都是非常实用的工具。 接下来&#xff0c;让我为你介绍…

Go语言入门心法(二): 结构体

一: Go语言中结构体认知 package mainimport "fmt"/*go语言中的结构体认知升维:*/ func main() {println(go语言中的结构体与c语言中的结构体类似;go语言中的结构体相当于java|python中类功能相当)type Book struct {title string // 标题author string // 作者…

在九天服务器平台上使用自己上传的数据集文件

1.进入到“数据管理”中&#xff0c;点击“新建数据” 2. 创建实例&#xff0c;进入到Jupyter页面 刚才上传的文件在data文件夹中 3. 将data文件夹中上传的数据集放到其他目录&#xff0c;比如这里我就放到了~/目录下 # 要把当前文件夹下的指定文件复制到目的路径的命令&…

Stm32_标准库_10_TIM_显示时间日期

利用TIM计数耗费1s,启动中断&#xff0c;秒表加一 时间显示代码&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h"uint16_t num 0; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_I…

超美!ChatGPT DALL-E 3已可用,另外GPT-4可上传图片进行问答

今天&#xff0c;在ChatGPT里使用DALL-E 3的功能终于上线了。以下是截图&#xff1a; 在GPT-4下加了一个菜单入口&#xff0c;名为 DALL-E 3&#xff0c;这也意味着ChatGPT免费账户暂时不能使用这个功能。 我们体验一下这个功能。 技术交流 建了技术交流群&#xff01;想要进…

STM32--WDG看门狗

文章目录 WDG简介IWDGIWDG的超时计算WWDGWWDG超时和窗口值设定独立看门狗工程WWDG工程 WDG简介 WDG看门狗&#xff08;Watchdog Timer&#xff09;是一种常见的硬件设备&#xff0c;在STM32F10系列中&#xff0c;有两种看门狗&#xff0c;分别是独立看门狗和窗口看门狗&#x…

Django 静态自定义化配置

STATIC # APP本地静态资源目录&#xff08;就APP对应的&#xff09; STATIC_URL "/static/"# 远程静态文件URL&#xff08;少用&#xff09; REMOTE_STATIC_URL# 外部引用静态文件目录&#xff08;外层的&#xff09; STATICFILES_DIRS [os.path.join(BASE_DIR, &…

Ubuntu系统下安装rpm安装包的方法

前言 Ubuntu的软件包格式为deb 而RPM格式的包归属于红帽子Red Hat 在这直接使用命令是安装不了的 需要通过一个桥梁进行转换 方法 将其rpm的格式包转换为deb的格式包 具体转换通过alien进行转换 这个安装包默认是没有安装的 sudo apt-get install alien 之后通过这个命令将…

相交链表Java

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 nu11。 以下有两种解决方法: 一种是用Map,利用其key值唯一的方法去判断(也可以使用set,set在add时,已存在的元素会返回false,不存在的返回…

元宇宙虚拟展厅:沉浸式体验、个性化互动、全新展示

近年来&#xff0c;大多数企业开始注重线上虚拟展厅的搭建&#xff0c;元宇宙虚拟展厅也为众多企业创造了更多有趣的体验&#xff0c;为商企带来了全新的宣传方式。相对于传统展厅而言&#xff0c;元宇宙虚拟展厅在场景真是复刻的基础上&#xff0c;做到了超越真实。 传统展厅的…

关于网络协议的若干问题(三)

1、当发送的报文出问题的时候&#xff0c;会发送一个 ICMP 的差错报文来报告错误&#xff0c;但是如果 ICMP 的差错报文也出问题了呢&#xff1f; 答&#xff1a;不会导致产生 ICMP 差错报文的有&#xff1a; ICMP 差错报文&#xff08;ICMP 查询报文可能会产生 ICMP 差错报文…

核心期刊发布通知:养育三孩家庭作者免收版面费!(附免收期刊盘点)

免收版面费通知 近日&#xff0c;中文核心期刊《财会通讯》在其官方微信平台发布通知《关于对养育三孩家庭的作者免收版面费的通知》。 图源&#xff1a;《财会通讯》官方微信平台 通知称&#xff1a;为落实党的二十大报告中关于“优化人口发展战略&#xff0c;建立生育支持…

如何在STM32中实现TCP通信?

如何在STM32中实现TCP通信&#xff1f; TCP通信在计算机网络中扮演着重要角色&#xff0c;实现它需要兼顾硬件和软件因素。 硬件层面&#xff0c;某些STM32处理器内置了Ethernet MAC&#xff0c;这有利于简化网络通信的部署。若处理器缺乏内置MAC&#xff0c;需外接以太网控制…

22字符串-简单反转

目录 BM&#xff08;Boyer-Moore&#xff09; 坏字符 好后缀 什么情况用哪个规则&#xff1f; LeetCode之路——151. 反转字符串中的单词 分析: 字符串匹配中除了简单的BF&#xff08;Brute Force&#xff09;、RK&#xff08;Rabin-Karp&#xff09;算法&#xff0c;还有…

物业巡检系统能做什么?物业服务如何提升管理效率?

随着科技的快速发展&#xff0c;物业管理行业也在寻求着更加高效、智能化的解决方案&#xff0c;以应对日益复杂的设备和环境巡检上的需求。目前传统的纸质巡检方式已经无法满足现代物业管理的要求&#xff0c;“的修”工单管理系统应运而生&#xff0c;它通过数字化、智能化的…

软件成果鉴定测试应该怎么做?对软件产品起到什么作用?

软件成果鉴定测试是指对一个软件产品进行全面、系统的测试&#xff0c;以评估其是否符合预期的要求、是否满足特定的标准和规范。该测试旨在发现和解决软件产品中的缺陷和问题&#xff0c;确保其质量和可靠性。 一、软件成果鉴定测试包括以下内容   1、需求分析&#xff1a;…

ctfshow-ssti

web361 名字就是考点&#xff0c;所以注入点就是name 先测试一下存不存在ssti漏洞 利用os模块&#xff0c;脚本 查看一下子类的集合 ?name{{.__class__.__base__.__subclasses__()}} 看看有没有os模块&#xff0c;查找os 利用这个类&#xff0c;用脚本跑他的位置 import …