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

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.rhkb.cn/news/156340.html

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

相关文章

es6(二)——常用es6说明

ES6的系列文章目录 es6&#xff08;一&#xff09;——var和let和const的区别 文章目录 ES6的系列文章目录一、变量的结构赋值1.数组的结构赋值2.对象的结构赋值 二、模板字符串三、扩展运算符1.字符串的使用2.数组的使用 四、箭头函数1.普通函数的定义2.箭头函数的定义3.箭头…

简单大方的自我介绍 PPT 格式

自我介绍是展示自己的机会&#xff0c;同时也是展现自信和魅力的重要时刻。通过简单大方的PPT格式&#xff0c;可以更好地展示自己的个性和才华。下面是一些建议&#xff0c;帮助你在自我介绍中展现自信和魅力。 1. 打造简洁而有吸引力的PPT布局&#xff1a; - 选择简洁大方的背…

数据库常见面试题--MySQL

梳理面试过程中数据库相关的常见问题&#xff0c;需要说明的是&#xff0c;这篇文章主要是基于MySQL数据库&#xff0c;其他类型的数据库还请自行参考使用。 数据库概述 为什么使用数据库 1、数据库增删改查更方便 2、提供了事务的能力 本质是更好的管理数据。 数据库体系结…

(部署服务器系列一)虚拟机模拟部署服务器

1、下载安装vmware 15 &#xff08;win7最高支持版&#xff09; 2、下载安装CentOS 配置2核2g&#xff08;最少&#xff09;磁盘100g&#xff08;不会实际占有&#xff09;选择时区-上海配置分区&#xff1a;https://blog.csdn.net/qq_35363507/article/details/127390889 &a…

借助PLC-Recorder,汇川中型PLC(AM、AC系列,CODESYS平台)2ms高速采集的方法

高速数据采集要保证速度&#xff0c;也要保证时刻的准确性。在windows系统里&#xff0c;时间稳定性是个很难的问题。如果PLC发送的数据里带有时间信息&#xff0c;则可以由PLC来保证采样周期的稳定性。 从V2.12版本开始&#xff0c;PLC-Recorder软件可以处理发送电文里的时间…

Ubuntu输入正确密码重新跳到登录界面

Ubuntu输入正确密码重新跳到登录界面 问题描述 输入正确的密码登录后闪一下又回到锁屏界面 输入正确的密码后还是回到这个界面 产生的原因 /etc/profile或者/etc/enviroment出现了问题,导致无法正常登录 该错误产生的原因不止一个 这里是因为/etc/profile或者/etc/enviromen出…

收银系统商品定价设计思考

一、背景 因为门店系统里商品总共也就几万款&#xff0c;一直以来都是根据条码由总部统一定价销售&#xff0c;现在有加盟店&#xff0c;各门店也有进行各自促销活动的需求&#xff0c;这就需要放开门店自主定价权&#xff0c;所以近段时间系统在商品定价上做了扩展。 二、商…

如何在雷电模拟器上安装Magisk并加载movecert模块抓https包(一)

环境&#xff1a;win10 64位&#xff0c;雷电模拟器版本4.0.78&#xff0c;Android版本7.1.2。 前几天写了一篇文章如何在逍遥模拟器上加载Magisk模块-CSDN博客&#xff0c;因为最近很忙&#xff0c;所以直到今天才有空写这一篇&#xff0c;记录如何在雷电模拟器上安装Magisk并…

基于uniapp的商城外卖小程序

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

LCD12864驱动开发

目录 一、概述 二、方框图 三、模块接口说明 1、串口接口管脚信号 2、并行接口 四、模块主要硬件构成说明 1、RS&#xff0c;R/W配4种模式&#xff1a; 2、E信号 五、指令说明 六、读写时序图 6.1 数据传输过程 6.2、时序图 6.3、串口读写时序 七、交流参数 八、软件…

TCP/IP(十五)拥塞控制

一 拥塞控制 ① 拥塞控制必要性 思考&#xff1a; 为什么要有拥塞控制呀,不是有流量控制了吗&#xff1f; ② 拥赛窗口 cwnd 什么是拥塞窗口? 和发送窗口有什么关系呢?明白&#xff1a; cwnd、swnd、rwnd 缩写 含义 ③ 如何知道当前网络是否出现了拥塞呢&#xff1f;…

2023年【危险化学品生产单位安全生产管理人员】及危险化学品生产单位安全生产管理人员模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品生产单位安全生产管理人员考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品生产单位安全生产管理人员模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品生产单位安…

微信开发工具构建npm and git切换分支

目录 git切换分支NPM构建 git切换分支 案例&#xff1a; 再次查看分支就会发现自己的分支已切换&#xff0c;然后需要重新构建NPM一次 NPM构建 记得安装一下这个&#xff0c;然后在构建 如果未安装NPM&#xff0c;这时候需要打开命令端&#xff0c;安装操作&#xff0c;操作…

Configuration Change派发到App进程

整体时序 // DisplayContent.java boolean updateDisplayOverrideConfigurationLocked(Configuration values,ActivityRecord starting, boolean deferResume,ActivityTaskManagerService.UpdateConfigurationResult result) {int changes 0;boolean kept true;mAtmService.d…

Andriod学习笔记(一)

写在前面的话 App开发的编程语言Java和KotlinXML App连接的数据库App工程目录结构模块级别的编译配置文件清单文件 界面显示与逻辑处理 安卓是一种基于Linux内核的自由及开放源代码的操作系统&#xff0c;主要使用于移动设备。 Mininum SDK表示安卓该版本以上的设备都可以运行该…

Restclient-cpp库介绍和实际应用:爬取www.sohu.com

概述 Restclient-cpp是一个用C编写的简单而优雅的RESTful客户端库&#xff0c;它可以方便地发送HTTP请求和处理响应。它基于libcurl和jsoncpp&#xff0c;支持GET, POST, PUT, PATCH, DELETE, HEAD等方法&#xff0c;以及自定义HTTP头部&#xff0c;超时设置&#xff0c;代理服…

节日灯饰灯串灯出口欧洲CE认证检测

灯串&#xff08;灯带&#xff09;&#xff0c;这个产品的形状就象一根带子一样&#xff0c;再加上产品的主要原件就是LED&#xff0c;因此叫做灯串或者灯带。2022年&#xff0c;我国灯具及相关配件产品出口总额超过460亿美元。其中北美是最大的出口市场。其次是欧洲市场&#…

智能工厂MES系统,终端设备支持手机、PDA、工业平板、PC

一、开源项目简介 源计划智能工厂MES系统(开源版) 功能包括销售管理&#xff0c;仓库管理&#xff0c;生产管理&#xff0c;质量管理&#xff0c;设备管理&#xff0c;条码追溯&#xff0c;财务管理&#xff0c;系统集成&#xff0c;移动端APP。 二、开源协议 使用GPL-3.0开…

YOLOV7改进:最新开源移动端网络架构 RepViT | RepViTBlock即插即用,助力检测 | 清华 ICCV 2023

💡💡💡本文独家原创改进:轻量级 ViT 的高效架构选择,逐步增强标准轻量级 CNN(特别是 MobileNetV3)的移动友好性。 最终产生了一个新的纯轻量级 CNN 系列,即 RepViT RepViTBlock即插即用,助力检测 | 亲测在多个数据集能够实现涨点,并实现轻量化 收录: YOLOv7…

【Debian系统】:安装debian系统之后,很多命令找不到,需要添加sudo之后才能使用,以下解决方法

项目场景&#xff1a; 问题描述 解决方案&#xff1a; 1.临时解决方案 2.永久解决方案 1.首先打开编辑&#xff1a; 2.打开之后最后一行添加代码&#xff1a; 3.最后运行一遍 .bashrc 4.已经可以了&#xff0c;可以试试reboot&#xff0c;重启一下机子 一点一滴才能成长 …