Java IO编程必备:FilterInputStream类的原理与实现

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在Java IO中,InputStream是输入流的基类,它是所有输入流的父类,定义了读取字节的基本方法。而FilterInputStream类是InputStream类的过滤器,用于提供输入流的过滤功能。

摘要

  FilterInputStream类是Java IO包中的一个类,它继承自InputStream类,并实现了InputStream类的所有方法。它提供了一种过滤器模式,允许应用程序在读取输入流之前或之后修改输入数据。

FilterInputStream类

简介

  FilterInputStream类是InputStream类的抽象子类,它包含其他输入流作为其基本来源,并使用这些流中的方法提供更多的功能。FilterInputStream类提供了许多实用的方法,包括read()、close()和available()等。此外,FilterInputStream类还提供了许多其他方法,用于读取不同数据类型的数据。

  FilterInputStream类是一个抽象类,因此不能被实例化,但可以通过其子类来创建流。该类的所有方法都可以在子类中使用。FilterInputStream类的子类包括BufferedInputStream、DataInputStream、PushbackInputStream等。

源代码解析

FilterInputStream类的源代码解析如下:

public class FilterInputStream extends InputStream {
    protected volatile InputStream in;
 
    protected FilterInputStream(InputStream in) {
        this.in = Objects.requireNonNull(in);
    }
 
    public int read() throws IOException {
        return in.read();
    }
 
    public int read(byte b[]) throws IOException {
        return read(b, 0, b.length);
    }
 
    public int read(byte b[], int off, int len) throws IOException {
        return in.read(b, off, len);
    }
 
    public long skip(long n) throws IOException {
        return in.skip(n);
    }
 
    public int available() throws IOException {
        return in.available();
    }
 
    public void close() throws IOException {
        in.close();
    }
 
    public synchronized void mark(int readlimit) {
        in.mark(readlimit);
    }
 
    public synchronized void reset() throws IOException {
        in.reset();
    }
 
    public boolean markSupported() {
        return in.markSupported();
    }
}

  从源代码可以看出,FilterInputStream类继承了InputStream类,并实现了InputStream类中的所有方法。同时,FilterInputStream类还增加了一个成员变量volatile InputStream in,它表示需要被过滤的输入流。

应用场景案例

FilterInputStream类常见的应用场景包括:

  1. 对读入的数据进行预处理,如解密、校验、转换等。
  2. 对读入的数据进行过滤,如过滤掉某些无用数据。
  3. 对读入的数据进行缓存,提高读取性能。

以下是一个基于FilterInputStream类实现的解密输入流的代码示例:

package com.example.javase.io.fileProject;

import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @Author 喵手
 * @Date 2023-10-19 23:59
 */
public class DecryptInputStream extends FilterInputStream {
    private final int key;

    public DecryptInputStream(InputStream inputStream, int key) {
        super(inputStream);
        this.key = key;
    }

    @Override
    public int read() throws IOException {
        int b = super.read();
        if (b != -1) {
            b = b ^ key; // 解密
        }
        return b;
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        int n = super.read(b, off, len);
        if (n > 0) {
            for (int i = off; i < off + n; i++) {
                b[i] = (byte) (b[i] ^ key); // 解密
            }
        }
        return n;
    }

}

  这段代码演示了一个基于FilterInputStream的输入流解密器实现。它重写了read方法,在读取数据时对数据进行了解密操作。使用这个解密器,可以很方便地对加密的输入流进行解密。

在这里插入图片描述

优缺点分析

FilterInputStream类的优点:

  1. 增强输入流的功能:FilterInputStream类可以通过其子类来实现不同的流操作,包括读取二进制文件、读取压缩文件等。

  2. 简化流操作:FilterInputStream类提供了许多实用的方法,可以简化流操作,并提高代码的可读性和可维护性。

  3. 可扩展性:FilterInputStream类是一个抽象类,它提供了基本的方法,可以在子类中进行扩展和重写,以实现不同的功能。

FilterInputStream类的缺点:

  1. 性能损失:使用FilterInputStream类会带来一定的性能损失,因为它需要对输入流进行额外的处理。
  2. 不适用于所有类型的流:FilterInputStream类只适用于某些类型的流,不适用于所有类型的流。

类代码方法介绍

FilterInputStream类提供了以下方法:

  1. 构造方法:FilterInputStream(InputStream in)。构造一个FilterInputStream对象,需要传入一个被过滤的输入流。
  2. read()方法:int read() throws IOException。从输入流中读取一个字节,返回读取的字节,如果已经到达输入流的结尾,则返回-1。
  3. read(byte b[], int off, int len)方法:int read(byte b[], int off, int len) throws IOException。从输入流中读取数据到字节数组中,并返回读取的字节数。
  4. skip(long n)方法:long skip(long n) throws IOException。从输入流中跳过n个字节,并返回实际跳过的字节数。
  5. available()方法:int available() throws IOException。返回输入流中可读的字节数。
  6. close()方法:void close() throws IOException。关闭输入流。
  7. mark(int readlimit)方法:void mark(int readlimit)。在当前位置设置一个标记,以便后续调用reset()方法时可以返回该位置。
  8. reset()方法:void reset() throws IOException。恢复到最后一次调用mark方法所在的位置。
  9. markSupported()方法:boolean markSupported()。判断mark()和reset()方法是否受支持。

测试用例

下面是一个使用FilterInputStream类的测试用例:

package com.example.javase.io.fileProject;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FilterInputStream;

/**
 * @Author 喵手
 * @Date 2023-10-20 0:02
 */
public class FilterInputStreamTest {

    public static void main(String[] args) throws Exception {
        FileInputStream in = null;
        FilterInputStream fin = null;
        try {
            in = new FileInputStream("testDoc.txt");
            fin = new BufferedInputStream(in);
            int c;
            while ((c = fin.read()) != -1) {
                System.out.print((char)c);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (fin != null) {
                fin.close();
            }
        }
    }
}

  该程序将打开一个文件,并使用FilterInputStream类来读取文件中的内容。程序将读取每个字节,并将其转换为字符,然后输出到控制台上。

如下是上述案例执行结果:


测试代码分析如下:

  该程序演示了如何使用 FilterInputStream 类,该类是 InputStream 的抽象装饰器类,它提供了一些附加的功能,例如缓冲和数据解密。

  具体来说,该程序首先创建了一个 FileInputStream 对象,然后将其传递给 FilterInputStream 的子类 BufferedInputStream,以创建一个带缓冲功能的输入流。然后,程序使用 read() 方法从输入流中读取字节,并将其转换为 char 类型,并在控制台上打印输出。最后,程序在 finally 块中关闭输入流和 FilterInputStream 对象。

  需要注意的是,该程序中使用了 try-finally 块来确保在任何情况下都会关闭输入流和 FilterInputStream 对象。此外,当使用 FilterInputStream 时,需要注意选择正确的子类,并根据实际需要设置适当的缓冲大小等参数。

全文小结

  FilterInputStream类是Java.io包中的一个类,用于增强输入流的功能。该类提供了许多实用的方法,可以通过其子类来实现不同的流操作。FilterInputStream类是一个抽象类,因此不能被实例化,但可以通过其子类来创建流。该类的子类包括BufferedInputStream、DataInputStream、PushbackInputStream等。使用FilterInputStream类可以简化流操作,并提高代码的可读性和可维护性。FilterInputStream类也具有一些缺点,包括性能损失和不适用于所有类型的流。因此,在使用FilterInputStream类时需要注意这些问题。

总结

  本文对Java.io包中的FilterInputStream类进行了详细的介绍和分析。我们了解了该类的特点和用法,并提供了一些使用FilterInputStream类的常见场景和测试用例。FilterInputStream类是一个非常有用的类,它可以帮助我们更好地实现流操作,并提高代码的可读性和可维护性。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何构建进攻性的网络安全防护策略

进攻性安全&#xff08;Offensive security&#xff09;是指一系列主动安全策略&#xff0c;这些策略与恶意行为者在现实世界的攻击中使用的策略相同&#xff0c;区别在于其目的是加强而非损害网络安全。常见的进攻性安全方法包括红队、渗透测试和漏洞评估。 进攻性安全行动通…

C++入门 ——类和对象(二)

this指针 this指针的引出 我们先来定义一个日期类 Date class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout <<_year<< "-" <<_month << "-"<< _da…

基于springboot+vue+Mysql的自习室预订系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Springboot工程创建

目录 一、步骤 二、遇到的问题及解决方案 一、步骤 打开idea,点击文件 ->新建 ->新模块 选择Spring Initializr&#xff0c;并设置相关信息。其中组为域名&#xff0c;如果没有公司&#xff0c;可以默认com.example。点击下一步 蓝色方框部分需要去掉&#xff0c;软件包…

牛客NC382 切割木头【中等 二分超找 Java/Go/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/707d98cee255448c838c76918a702be0 核心 二分查找Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可…

SpringBoot指标监控

一.SpringBoot指标监控_添加Actuator功能 Spring Boot Actuator可以帮助程序员监控和管理SpringBoot应用&#xff0c;比如健康检查、内存使用情况统计、线程使用情况统计等。我 们在SpringBoot项目中添加Actuator功能&#xff0c;即可使用Actuator监控 项目&#xff0c;用法如…

Vue的项目启动指令分析

通过Vue CLI脚手架创建的项目&#xff0c;默认的启动项目方式是 npm run serve 这里的serve是可以修改的。 在创建的项目目录中&#xff0c;找到package.json 双击打开&#xff0c;找到scripts部分 在scripts部分&#xff0c;有一个"serve"键值对&#xff0c;这里的…

知乎23届数据分析校招A卷——笔记

1、and 和 or的并列运用[先看and] 条件1 OR 条件2 AND 条件3 执行顺序是先执行AND操作符&#xff08;先看条件2和3&#xff09;&#xff0c;再根据其结果判断是否需要执行OR操作符&#xff0c;并最终返回整个表达式的逻辑结果。 条件1 and 条件2 or 条件3 执行逻辑是先执行…

使用socket+Python实现ping

import os import socket import struct import select import time# 计算校验和&#xff0c;用于确保数据的完整性 def checksum(source_string):sum 0count 0max_count len(source_string)# 处理成对的字节while count < max_count - 1:val source_string[count 1] *…

nginx的前世今生(二)

书接上回&#xff1a; 上回书说到&#xff0c;nginx的前世今生&#xff0c;这回我们继续说 3.缓冲秘籍&#xff0c;洪流控水 Nginx的缓冲区是其处理数据传输和提高性能的关键设计之一&#xff0c;主要用于暂存和管理进出的数据流&#xff0c;以应对不同组件间速度不匹配的问题…

PG WAL日志理解

类似于oracle的redo log&#xff0c;用于数据库恢复&#xff0c;当一条SQL语句执行&#xff0c;PG会把对应的块放到缓冲区执行&#xff0c;&#xff0c;会写进WAL缓冲区会进行写操作&#xff0c;commit后&#xff0c;WAL writer进程进行写操作&#xff0c;把日志缓冲区WAL buff…

SpringData JPA - ORM 框架下,打造高效数据访问层

目录 一、SpringData JPA 概述 1.1、什么是 JPA 1.2、什么是 ORM 1.3、什么是 Hibernate 1.4、JPA 和 Hibernate 的关系 1.5、JPA 的优势 二、SpringData JPA 实战开发 2.1、依赖 2.2、配置文件 2.3、启动类 2.4、创建实体 2.5、基于 JpaRepository 的 CRUD 三、…

超市购物|基于SprinBoot+vue的超市购物系统(源码+数据库+文档)

目录 基于SprinBootvue的企业人事管理系统 一、前言 二、系统设计 三、系统功能设计 1商品管理 2公告管理 3公告类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设…

C语言--带环链表问题

继续学习 一、判断链表是否带环 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;用快慢指针&#xff0c;快指针走两步&#xff0c;慢指针走一步&#xff0c;当慢指针走一半快指针进到环里 当慢指针进环&#xff0c;快指针已经在环中转了一会儿了 | |…

“字节跳动-文远知行杯”——广东工业大学第十四届程序设计竞赛

补题补题&#xff1a; A、hzy 和zsl 的生存挑战 题解&#xff1a;由于我们去考虑最优解&#xff0c;那么其中两人就应该是这样走法&#xff0c;一人选择相同数&#xff0c;另一人选择相反数&#xff0c;这样必会通关 #include <iostream> using namespace std;int main(…

Web服务器手动配置

目录 配置环境 http配置 配置步骤 1、首先安装Nginx&#xff08;已经安装的跳过这步&#xff09; 2、查看一下下Nginx的配置文件结构&#xff0c;了解如何配置&#xff0c;以及配置的各个条目有什么作用&#xff08;为接下来的配置打基础&#xff09; 3、创建你的网页 4、…

【银角大王——Django课程——靓号搜索实现/单独一篇】

搜索框功能实现 靓号搜索在Django框架中搜索功能实现——底层就是模糊查询添加一个搜索框&#xff0c;使用bootstrap框架将GO&#xff01;修改成一个放大镜靓号列表函数代码解释效果演示 靓号搜索 在Django框架中搜索功能实现——底层就是模糊查询 数字条件用法字符串条件用法…

学习如何使用PyQt5实现notebook功能

百度搜索“pyqt5中notebook控件”&#xff0c;AI自动生成相应例子的代码。在 PyQt5 中&#xff0c;QTabWidget 类被用作 Notebook 控件。以下是一个简单的示例&#xff0c;展示如何创建一个带有两个标签的 Notebook 控件&#xff0c;并在每个标签中放置一些文本。 import sys f…

电子信息工程专业就业前景怎么样

电子信息工程专业的就业前景十分广阔&#xff0c;主要得益于现代社会对信息技术的依赖不断加深以及科技的快速发展&#xff0c;以下是上大学网&#xff08;www.sdaxue.com&#xff09;对该专业就业前景的具体分析&#xff0c;供大家参考&#xff01; 行业需求广泛&#xff1a;随…

VBA字典与数组第十四讲:单列数组与单行数组间的运算

《VBA数组与字典方案》教程&#xff08;10144533&#xff09;是我推出的第三套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;字典是VBA的精华&#xff0c;我要求学员必学。7.1.3.9教程和手册掌握后&#xff0c;可以解决大多数工作中遇到的实际问题。…