掌握FilterOutputStream类!

   咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java IO相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
 
文章目录
- 前言
 - 摘要
 - `FilterOutputStream`类
 - 概述
 - 优缺点分析
 - 优点:
 - 缺点:
 
- 应用场景
 - 常用使用方法
 - 源代码解析
 - 提升Java IO性能的技巧
 - 测试用例演示
 - 测试代码
 - 测试代码分析
 - 测试结果展示
 
- 小结
 
- 总结
 - 附录源码
 - ☀️建议/推荐你
 - 📣关于我
 
前言
  在Java开发中,IO操作是非常常见的需求。如何提升IO的性能是我们需要关注的重点。在Java中,FilterOutputStream类是一个非常重要的类,可以通过它来实现数据的高效输出。本文将深入掌握FilterOutputStream类,分享一些提升Java IO性能的技巧,帮助Java开发者更好地利用Java IO操作。
摘要
本文主要内容如下:
FilterOutputStream类的概述FilterOutputStream类的使用方法及源代码解析- 提升Java IO性能的技巧
 - 测试用例及运行结果展示
 - 全文小结
 
FilterOutputStream类
 
概述
  在Java中,FilterOutputStream类是一个装饰器模式的实现,它继承自OutputStream类。通过它可以对输出流进行装饰,从而增强输出流的功能,比如添加缓冲区、添加压缩等。FilterOutputStream类是Java IO中众多装饰器中的一种,其他常用的装饰器还包括BufferedOutputStream、DataOutputStream等。
优缺点分析
FilterOutputStream是Java IO中的输出流之一,它是一个抽象类,继承自OutputStream。它提供了一组过滤器,可以帮助我们在向OutputStream对象写入数据时,实现对数据的修改或转换。
优点:
- 可以通过添加过滤器来对数据进行修改或转换,提高程序的灵活性和可扩展性;
 - 可以通过添加多个过滤器,构成一个过滤器流,实现逐层处理数据的功能;
 - 支持字节写入,比字符流更加高效;
 - 可以通过继承FilterOutputStream来实现自定义的过滤器。
 
缺点:
- 需要了解各种过滤器的工作原理,增加了开发难度;
 - 过多使用过滤器会影响程序的性能;
 - 只支持字节流,无法处理字符流。
 
应用场景
- 数据加密和压缩:可以通过FilterOutputStream来添加加密或压缩过滤器,对数据进行加密或压缩;
 - 二进制数据处理:可以使用FilterOutputStream来处理二进制数据,比如图片、音频等;
 - 自定义格式的数据输出:可以通过继承FilterOutputStream,实现自定义格式的数据输出;
 - 网络流的处理:可以使用FilterOutputStream来添加网络流过滤器,实现对网络流数据的处理。
 
常用使用方法
FilterOutputStream类提供了很多方法来增强输出流的功能,主要包括:
flush()方法:刷新输出流。write(byte b[])方法:将字节数组b写入输出流。write(byte b[], int off, int len)方法:将字节数组b中从偏移量off开始的长度为len的字节写入输出流。write(int b)方法:将指定的字节写入输出流。close()方法:关闭输出流。
下面是一个简单的例子,通过FilterOutputStream将字符串写入文件:
package com.example.javase.io.filterOutputStream;import java.io.FileOutputStream;
import java.io.FilterOutputStream;
import java.io.IOException;/*** @Author bug菌* @Date 2023-10-15 20:17*/
public class WriterFilterOutputStream {public static void main(String[] args) throws IOException {String s = "Hello, world!jym!!!";FileOutputStream fos = new FileOutputStream("./template/hello.txt");FilterOutputStream fosFilter = new FilterOutputStream(fos);byte[] bytes = s.getBytes();fosFilter.write(bytes);fosFilter.flush();fosFilter.close();}
}
 
执行结果如下:

   这里创建了一个FileOutputStream对象fos,然后将它作为参数创建一个FilterOutputStream对象fosFilter。最后,将字符串转换成字节数组,通过write(byte b[])方法将字节数组写入输出流中,并通过flush()方法和close()方法来刷新和关闭输出流。
源代码解析
接下来,我们来分析一下FilterOutputStream类的源代码:
public class FilterOutputStream extends OutputStream {protected OutputStream out;public FilterOutputStream(OutputStream out) {this.out = out;}public void write(int b) throws IOException {out.write(b);}public void write(byte b[]) throws IOException {write(b, 0, b.length);}public void write(byte b[], int off, int len) throws IOException {if ((off | len | (b.length - (len + off)) | (off + len)) < 0) {throw new IndexOutOfBoundsException();}for (int i = 0 ; i < len ; i++) {write(b[off + i]);}}public void flush() throws IOException {out.flush();}public void close() throws IOException {out.close();}
}
 
  在上述代码中,我们可以看到,FilterOutputStream类继承了OutputStream类,并实现了它的五个方法:write(int b)、write(byte[] b)、write(byte[] b, int off, int len)、flush()和close()。其中,write(int b)方法和flush()方法的实现都是调用了输出流的对应方法,而write(byte[] b)、write(byte[] b, int off, int len)方法则是通过循环调用write(int b)方法来实现对字节数组的写入。
提升Java IO性能的技巧
- 重用缓冲区:如果数据量较大,可以通过重用缓冲区来提高IO性能。一般来说,缓冲区大小应该设置为2的幂次方,这样可以使计算机的读写操作更加高效。
 - 异步IO:使用异步IO可以让应用程序在读取和写入数据时不必等待IO操作完成,从而提高性能。
 - 文件内存映射:文件内存映射可以将文件直接映射到内存中,从而提高IO性能,尤其是在读取大文件时。
 - 压缩输出流:如果需要输出到压缩文件,可以使用
GZIPOutputStream或ZipOutputStream等压缩输出流来提高IO性能。 
测试用例演示
测试代码
  我们使用上面的例子来测试FilterOutputStream类的性能。我们分别测试了使用FileOutputStream和FilterOutputStream写入4MB的文件所需的时间,并对比两者的性能差异。
package com.example.javase.io.filterOutputStream;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilterOutputStream;
import java.io.IOException;/*** @Author bug菌* @Date 2023-10-15 20:06*/
public class FilterOutputStreamTest {public static void main(String[] args) throws IOException {long startTime = System.currentTimeMillis();FileOutputStream fos = new FileOutputStream("./template/hello.txt");for (int i = 0; i < 4 * 1024 * 1024; i++) {fos.write('a');}fos.close();long endTime = System.currentTimeMillis();System.out.println("FileOutputStream Time: " + (endTime - startTime) + " ms");startTime = System.currentTimeMillis();FileOutputStream fos2 = new FileOutputStream("./template/hello.txt");FilterOutputStream fosFilter = new FilterOutputStream(fos2);for (int i = 0; i < 4 * 1024 * 1024; i++) {fosFilter.write('a');}fosFilter.flush();fosFilter.close();endTime = System.currentTimeMillis();System.out.println("FilterOutputStream Time: " + (endTime - startTime) + " ms");}
}
 
测试代码分析
这段代码演示了如何使用Java中的FilterOutputStream类来写入数据到文件中。主要包括以下步骤:
-  
通过
FileOutputStream类创建一个文件输出流对象fos,并将要写入的文件路径传递给构造函数。 -  
通过
fos.write()方法将’a’字符写入文件中,这里循环写入了410241024个’a’字符。 -  
关闭文件输出流。
 -  
接着,又创建了一个文件输出流对象
fos2,并将要写入的文件路径传递给构造函数。 -  
创建一个
FilterOutputStream对象fosFilter,并将其构造函数中传入fos2对象。 -  
通过
fosFilter.write()方法将’a’字符写入文件中,同样循环写入了410241024个’a’字符。 -  
通过
fosFilter.flush()方法将缓冲区的数据刷入文件。 -  
最后关闭
fosFilter对象,也就是关闭了fos2对象。 -  
输出写入时间。
 
  总体来说,使用FilterOutputStream类和FileOutputStream类将数据写入文件的方法是类似的,但是FilterOutputStream类提供了对输出流的过滤和处理,例如对数据进行加密解密等操作,因此开销相对较大,速度也较慢。
测试结果展示
测试结果如下:
FileOutputStream Time: 39030 ms
FilterOutputStream Time: 39121 ms
 
截图如下:

小结
  本文深入掌握了FilterOutputStream类,介绍了其使用方法及源代码解析,并分享了一些提升Java IO性能的技巧。通过测试用例,我们可以看到使用FilterOutputStream会略微降低IO性能,但它仍然是一个非常有用的类,尤其是在需要增强输出流功能的场景中。希望本文能够帮助Java开发者更好地利用Java IO操作,提升程序性能。
总结
  本文介绍了Java中FilterOutputStream类的概述、使用方法及源代码解析,同时分享了一些提升Java IO性能的技巧,如重用缓冲区、异步IO、文件内存映射和压缩输出流等。通过测试用例,我们可以看到使用FilterOutputStream会略微降低IO性能,但在需要增强输出流功能的情况下,仍然是一个非常有用的类。希望本文能够帮助Java开发者更好地利用Java IO操作,提升程序性能。
附录源码
如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。
☀️建议/推荐你
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
📣关于我
我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

相关文章:
掌握FilterOutputStream类!
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java IO相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…...
YOLOv8改进 | 图像去雾 | 特征融合注意网络FFA-Net增强YOLOv8对于模糊图片检测能力(北大和北航联合提出)
一、本文介绍 本文给大家带来的改进机制是由北大和北航联合提出的FFA-net: Feature Fusion Attention Network for Single Image Dehazing图像增强去雾网络,该网络的主要思想是利用特征融合注意力网络(Feature Fusion Attention Network)直接…...
Python (用户登录、身份归属地查询添加异常处理、绘制多角星、电影信息提取)
任务一:用户登录 登录系统通常分为普通用户与管理员权限,在用户登录系统时,可以根据自身权限进行选择登录。本任务要求实现一个用户登录的程序,该程序分为管理员用户与普通用户,其中管理员账号密码在程序中设定&#…...
Set cancelled by MemoryScratchSinkOperator
Bug信息 Caused by: com.starrocks.connector.spark.exception.StarrocksInternalException: StarRocks server StarRocks BE{host=10.9.14.39, port=9060} internal failed, status code [CANCELLED] error message is [Set cancelled by MemoryScratchSinkOperator]Bug产生的…...
Python 查找PDF中的指定文本并高亮显示
在处理大量PDF文档时,有时我们需要快速找到特定的文本信息。本文将提供以下三个Python示例来帮助你在PDF文件中快速查找并高亮指定的文本。 查找并高亮PDF中所有的指定文本查找并高亮PDF某个区域内的指定文本使用正则表达式搜索指定文本并高亮 本文将用到国产第三方…...
岩土工程渗流问题之有限单元法:理论、模块化编程实现、开源程序应用
有限单元法在岩土工程问题中应用非常广泛,很多商业软件如Plaxis/Abaqus/Comsol等都采用有限单元解法。尽管各类商业软件使用方便,但其使用对用户来说往往是一个“黑箱子”。相比而言,开源的有限元程序计算方法透明、计算过程可控,…...
解决 :nvrtc: error: invalid value for --gpu-architecture (-arch)
核心:在显卡安装的cuda版本适配的pytorch中,更换pytorch的版本 刚遇到这个错误时,在网上搜索了一下,感谢博主1和博主2的解决方法带给我的启发。 标题服务器cuda是11.3版本,配置其他环境“御用”的pytorch安装语句 co…...
Rust教程:How to Rust-从开始之前到Hello World
本文为第0篇 专栏简介 本专栏是优质Rust技术专栏,推荐精通一门技术栈的蟹友,不建议基础的同学(无基础学Rust也是牛人[手动捂脸]) 感谢Rust圣经开源社区的同学,为后来者提供了非常优秀的Rust学习资源 本文使用&…...
浅谈人工智能
☕️各位观众老爷好,路过点个免费的赞再走呗!❤️❤️(*•̀ᴗ•́*)و 前言 随着2024年的到来,人工智能领域正迎来前所未有的变革和发展。随着计算能力的增强、大数据的积累以及机器学习算法的进步, AI的定义和本质 人工智能…...
OpenFeign服务接口调用
OpenFeign服务接口调用 1、OpenFeign简介  Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。使用Feign创建一个接口并对其进行注释。它具有可插入的注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud添加…...
SQLiteC/C++接口详细介绍之sqlite3类(五)
快速跳转文章列表:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(四) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(六)(未发表) 14.sqlite3_busy_handle…...
Linux 之二:CentOS7 的 IP 常用命令和配置及 xshell 基本使用方法
1. 进入虚拟机 点击右键---进入终端--输入 ip adrr 或 ifconfig 查看ip地址 下面输入命令 ifconfig(注意:不是 ipconfig ) 或 ip addr 来查看当前系统 IP 查看到IP 后,比如:上面是 192.168.184.137 1.1 IP 常用命令…...
24-Java策略模式 ( Strategy Pattern )
Java策略模式 摘要实现范例 策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更加灵活,具有更好的维护性和扩展性。 策略模式属于行为型模式 摘要 1. 意图 针对一组算法,将每一个算法封装到具有共…...
突破编程_C++_C++11新特性(模板的改进与细节)
1 模板右尖括号的改进 在 C11 之前,模板的解析和实例化过程中,右尖括号 > 的处理有时会导致一些意外的结果,特别是在嵌套模板或模板模板参数中。这是因为 C 编译器通常会试图“查看前方”来确定何时结束模板参数的列表,这有时…...
云原生消息流系统 Apache RocketMQ 在腾讯云的大规模生产实践
导语 随着云计算技术的日益成熟,云原生应用已逐渐成为企业数字化转型的核心驱动力。在这一大背景下,高效、稳定、可扩展的消息流系统显得尤为重要。腾讯云高级开发工程师李伟先生,凭借其深厚的技术功底和丰富的实战经验,为我们带…...
Node.js的事件驱动模型(非阻塞I/O)
Node.js的事件驱动模型是它能高效处理并发的关键。这个模型允许Node.js在单个线程上运行,同时通过非阻塞I/O操作来处理成千上万的并发连接。下面是对Node.js事件驱动模型的详细解释: 事件循环(Event Loop) 事件循环是Node.js事件…...
java过滤器Filter相关知识点汇总
1.Filter概述 Servlet Filter又称Servlet过滤器,它是在Servlet2.3规范中定义的,能够对Servlet容器传给Web资源的request对象和response对象执行检查和修改。 Filter不是Servlet,不能直接访问,其本身也不能生成request对象和resp…...
旅游景区公共广播 园区广播 公路服务区广播
旅游景区公共广播 园区广播 公路服务区广播 旅游景区公共广播 旅游景区公共广播(又称背景音乐)简称BGM,它的主要作用是掩盖噪声并创造一种轻松和谐的气氛,是一种创造轻松愉快环境气氛的音乐。掩盖环境噪声,创造与旅游景区相适应的气氛&#…...
Elastic Stack--09--ElasticsearchRestTemplate
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 spring-data-elasticsearch提供的APIQueryBuildersElasticsearchRestTemplate 方法ElasticsearchRestTemplate ---操作索引 ElasticsearchRestTemplate ---文档操作…...
论坛管理系统|基于Spring Boot+ Mysql+Java+B/S架构的论坛管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)
推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能模块 系统功能设计 数据库E-R图设计 l…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
