哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区: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 !!!


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

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

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

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐