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

2023-11-17 11:28:28 浏览数 (1)

哈喽,各位小伙伴们,你们好,我是喵手。

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

  我是一名Java开发,所以日常接触到最多的就是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类的源代码解析如下:

代码语言:java复制
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类实现的解密输入流的代码示例:

代码语言:java复制
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类的测试用例:

代码语言:java复制
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 !!!


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

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

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

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞