前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java IO编程必备:FilterInputStream类的原理与实现

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

原创
作者头像
喵手
发布2023-11-17 11:28:28
2140
发布2023-11-17 11:28:28
举报
文章被收录于专栏:Java进阶实战

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

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

  我是一名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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 摘要
  • FilterInputStream类
    • 简介
      • 源代码解析
        • 应用场景案例
          • 优缺点分析
            • 类代码方法介绍
              • 测试用例
                • 全文小结
                • 总结
                • 文末
                相关产品与服务
                腾讯云代码分析
                腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档