掌握FilterOutputStream类!

news2024/11/18 23:26:26

在这里插入图片描述
  咦咦咦,各位小可爱,我是你们的好伙伴——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操作。

摘要

本文主要内容如下:

  1. FilterOutputStream类的概述
  2. FilterOutputStream类的使用方法及源代码解析
  3. 提升Java IO性能的技巧
  4. 测试用例及运行结果展示
  5. 全文小结

FilterOutputStream

概述

  在Java中,FilterOutputStream类是一个装饰器模式的实现,它继承自OutputStream类。通过它可以对输出流进行装饰,从而增强输出流的功能,比如添加缓冲区、添加压缩等。FilterOutputStream类是Java IO中众多装饰器中的一种,其他常用的装饰器还包括BufferedOutputStreamDataOutputStream等。

优缺点分析

  FilterOutputStream是Java IO中的输出流之一,它是一个抽象类,继承自OutputStream。它提供了一组过滤器,可以帮助我们在向OutputStream对象写入数据时,实现对数据的修改或转换。

优点:

  1. 可以通过添加过滤器来对数据进行修改或转换,提高程序的灵活性和可扩展性;
  2. 可以通过添加多个过滤器,构成一个过滤器流,实现逐层处理数据的功能;
  3. 支持字节写入,比字符流更加高效;
  4. 可以通过继承FilterOutputStream来实现自定义的过滤器。

缺点:

  1. 需要了解各种过滤器的工作原理,增加了开发难度;
  2. 过多使用过滤器会影响程序的性能;
  3. 只支持字节流,无法处理字符流。

应用场景

  1. 数据加密和压缩:可以通过FilterOutputStream来添加加密或压缩过滤器,对数据进行加密或压缩;
  2. 二进制数据处理:可以使用FilterOutputStream来处理二进制数据,比如图片、音频等;
  3. 自定义格式的数据输出:可以通过继承FilterOutputStream,实现自定义格式的数据输出;
  4. 网络流的处理:可以使用FilterOutputStream来添加网络流过滤器,实现对网络流数据的处理。

常用使用方法

FilterOutputStream类提供了很多方法来增强输出流的功能,主要包括:

  1. flush()方法:刷新输出流。
  2. write(byte b[])方法:将字节数组b写入输出流。
  3. write(byte b[], int off, int len)方法:将字节数组b中从偏移量off开始的长度为len的字节写入输出流。
  4. write(int b)方法:将指定的字节写入输出流。
  5. 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性能的技巧

  1. 重用缓冲区:如果数据量较大,可以通过重用缓冲区来提高IO性能。一般来说,缓冲区大小应该设置为2的幂次方,这样可以使计算机的读写操作更加高效。
  2. 异步IO:使用异步IO可以让应用程序在读取和写入数据时不必等待IO操作完成,从而提高性能。
  3. 文件内存映射:文件内存映射可以将文件直接映射到内存中,从而提高IO性能,尤其是在读取大文件时。
  4. 压缩输出流:如果需要输出到压缩文件,可以使用GZIPOutputStreamZipOutputStream等压缩输出流来提高IO性能。

测试用例演示

测试代码

  我们使用上面的例子来测试FilterOutputStream类的性能。我们分别测试了使用FileOutputStreamFilterOutputStream写入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类来写入数据到文件中。主要包括以下步骤:

  1. 通过FileOutputStream类创建一个文件输出流对象fos,并将要写入的文件路径传递给构造函数。

  2. 通过fos.write()方法将’a’字符写入文件中,这里循环写入了410241024个’a’字符。

  3. 关闭文件输出流。

  4. 接着,又创建了一个文件输出流对象fos2,并将要写入的文件路径传递给构造函数。

  5. 创建一个FilterOutputStream对象fosFilter,并将其构造函数中传入fos2对象。

  6. 通过fosFilter.write()方法将’a’字符写入文件中,同样循环写入了410241024个’a’字符。

  7. 通过fosFilter.flush()方法将缓冲区的数据刷入文件。

  8. 最后关闭fosFilter对象,也就是关闭了fos2对象。

  9. 输出写入时间。

  总体来说,使用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电子书籍、简历模板等海量资料。


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

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

相关文章

谈谈Darknet53为啥这么难训练

在我使用Imagenet2012对Darknet53进行预训练的时候&#xff0c;往往训练到一半&#xff0c;就会出现过拟合&#xff0c;导致无法继续向下训练&#xff0c;尝试了很多方法&#xff0c;最后发现问题出现在下图红框的部分。 得出这个结论是因为当我使用Resnet中&#xff0c;包含有…

力扣654 最大二叉树 Java版本

文章目录 题目描述解题思路代码 题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上…

【DVWA】19. Insecure CAPTCHA 不安全的验证码(全等级)

文章目录 1. Low1) 源码分析2&#xff09;实操 2. Medium1) 源码分析2&#xff09;实操 3. High1) 源码分析2&#xff09;实操 4. Impossible1) 源码分析 1. Low 1) 源码分析 <?phpif( isset( $_POST[ Change ] ) && ( $_POST[ step ] 1 ) ) {// Hide the CAPTC…

WPF图表库LiveCharts的使用

这个LiveCharts非常考究版本&#xff0c;它有非常多个版本&#xff0c;.net6对应的是LiveChart2 我这里的wpf项目是.net6&#xff0c;所以安装的是这三个&#xff0c;搜索的时候要将按钮“包括愈发行版”打勾 git&#xff1a;https://github.com/beto-rodriguez/LiveCharts2?…

BUGKU-WEB never_give_up

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 F12查看请求和响应&#xff0c;查找线索 相关工具 base64解码URL解码Burp Suit抓包 解题步骤 F12查看请求和响应&#xff0c;发现一行注释包含一个文件名称【1p.html】&#xff0c;这应该就是提…

GaN HEMTs在电力电子应用中的交叉耦合与基板电容分析与建模

来源&#xff1a;Analysis and Modeling of Cross-Coupling and Substrate Capacitances in GaN HEMTs for Power-Electronic Applications&#xff08; TED 17年&#xff09; 摘要 本文提出了一种考虑了基板电容与场板之间交叉耦合效应的场板AlGaN/GaN高电子迁移率晶体管(HE…

RabbitMQ自学笔记——消息可靠性问题

1.发送者的可靠性 1.1生产者重连 有时由于网络波动等原因&#xff0c;发送方一次可能没有连接上RabbitMQ&#xff0c;我们可以配置发送方的连接失败重试机制。但需要注意的是&#xff1a;SpringAMQP提供的重试机制是阻塞式的重试&#xff0c;也就是说多次重试等待的过程中&am…

[JAVAEE]—进程和多线程的认识

文章目录 什么是线程什么是进程进程的组成什么是pcb 进程概括线程线程与进程的关系线程的特点 创建线程创建线程方法创建线程的第二种方法对比 其他的方式匿名内部类创建线程匿名内部类创建Runable的子类lambda表达式创建一个线程 多线程的优势 什么是线程 什么是进程 首先想…

iOS 判断触摸位置是否在图片的透明区域

装扮功能系列&#xff1a; Swift 使用UIScrollerView 实现装扮功能&#xff08;基础&#xff09;Swift 使用UIScrollerView 实现装扮功能&#xff08;拓展&#xff09;iOS 判断触摸位置是否在图片的透明区域 背景 在装扮功能中&#xff0c;一般都是长按使道具进入编辑状态&…

ES分布式搜索-使用RestClient操作索引库

RestClient操作索引库 1、什么是RestClient&#xff1f; ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。官方文档地址&#xff1a;Elasticsearch Clients官方文档 2、利用JavaRestClient实现…

软考高级:软件架构风格-闭环控制概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Python 查找PDF中的指定文本并高亮显示

在处理大量PDF文档时&#xff0c;有时我们需要快速找到特定的文本信息。本文将提供以下三个Python示例来帮助你在PDF文件中快速查找并高亮指定的文本。 查找并高亮PDF中所有的指定文本查找并高亮PDF某个区域内的指定文本使用正则表达式搜索指定文本并高亮 本文将用到国产第三方…

Java学习笔记(11)

面向对象进阶 Static 静态变量 所有对象一起共享&#xff0c;就用static修饰 不属于对象&#xff0c;属于类的 可以用 类名.静态变量 “”&#xff1b;赋值 但是 对象.静态变量也可以访问到内容 Static内存图 Student这个类的字节码文件加载到方法区&#xff0c;并在内…

企业计算机服务器中了eking勒索病毒怎么办?Eking勒索病毒解密工具流程

网络数据安全问题一直是众多企业关心的主要话题&#xff0c;网络在为企业提供便利的同时&#xff0c;也为企业数据安全带来未知的隐患。近日&#xff0c;云天数据恢复中心接到许多企业求助&#xff0c;企业的计算机服务器遭到了eking勒索病毒攻击导致企业计算机服务器系统瘫痪无…

操作系统——cpu、内存、缓存介绍

一、内存是什么 内存就是系统资源的代名词&#xff0c;它是其他硬件设备与 CPU 沟通的桥梁&#xff0c; 计算机中的所有程序都在内存中运行。其作用是暂时存放CPU的运算数据&#xff0c;以及与硬盘交换的数据。也是相当于CPU与硬盘沟通的桥梁。只要计算机在运行&#xff0c;CP…

YOLOv9实例分割教程|(一)训练教程

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、创建数据集及数据配置文件 创新一个文件夹存放分割数据集&#xff0c;包含一个images和labels文件夹。标签格式如下所示&#xff1a; 创新数据集…

Netty线程模型详解

文章目录 概述单Reactor单线程模型单Reactor多线程模型主从Reactor多线程模型 概述 Netty的线程模型采用了Reactor模式&#xff0c;即一个或多个EventLoop轮询各自的任务队列&#xff0c;当发现有任务时&#xff0c;就处理它们。Netty支持单线程模型、多线程模型和混合线程模型…

1、计划任务介绍

Windows计划任务介绍 1、含义&#xff1a; 简单点就是定时执行任务。 在许多场景下&#xff0c;我们定时执行一些任务。比如&#xff1a;定时拉取、备份文件&#xff0c;更新代码等等操作。 WinR打开运行框&#xff0c;输入&#xff1a;control schedtasks&#xff0c;就会…

SAR ADC系列4——比较器的Transient noise仿真--等效输入噪声

仿真出等效输入噪声 加一个快于实际工作的时钟频率&#xff1b;在输入端加一个DC的差&#xff08;比如一端是0.5VDD&#xff0c;另外一端加0.5VDD0.2MV)计算仿真时间内的correct counting number&#xff0c;比如时钟频率是200MHz&#xff0c;仿真时间是5us&#xff0c;那么应…

IMX8MM -- Yocto构建遇见的错误及解决方法:

IMX8MM Yocto构建遇见的错误及解决方法&#xff1a; 1 bison-3.0.4 error2 Opencv BB_NO_NETWORK Error &#xff1a;3 Yocto构建时出现U-boot 问题4 Yocto构建时出现Linux kernel编译问题5 wayland-native6 cross-localedef-native7 wayland-protocols8 mesa 硬件&#xff1a;…