哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区: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类常见的应用场景包括:
- 对读入的数据进行预处理,如解密、校验、转换等。
- 对读入的数据进行过滤,如过滤掉某些无用数据。
- 对读入的数据进行缓存,提高读取性能。
以下是一个基于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类的优点:
-
增强输入流的功能:
FilterInputStream
类可以通过其子类来实现不同的流操作,包括读取二进制文件、读取压缩文件等。 -
简化流操作:
FilterInputStream
类提供了许多实用的方法,可以简化流操作,并提高代码的可读性和可维护性。 -
可扩展性:
FilterInputStream
类是一个抽象类,它提供了基本的方法,可以在子类中进行扩展和重写,以实现不同的功能。
FilterInputStream类的缺点:
- 性能损失:使用FilterInputStream类会带来一定的性能损失,因为它需要对输入流进行额外的处理。
- 不适用于所有类型的流:FilterInputStream类只适用于某些类型的流,不适用于所有类型的流。
类代码方法介绍
FilterInputStream类提供了以下方法:
- 构造方法:FilterInputStream(InputStream in)。构造一个FilterInputStream对象,需要传入一个被过滤的输入流。
- read()方法:int read() throws IOException。从输入流中读取一个字节,返回读取的字节,如果已经到达输入流的结尾,则返回-1。
- read(byte b[], int off, int len)方法:int read(byte b[], int off, int len) throws IOException。从输入流中读取数据到字节数组中,并返回读取的字节数。
- skip(long n)方法:long skip(long n) throws IOException。从输入流中跳过n个字节,并返回实际跳过的字节数。
- available()方法:int available() throws IOException。返回输入流中可读的字节数。
- close()方法:void close() throws IOException。关闭输入流。
- mark(int readlimit)方法:void mark(int readlimit)。在当前位置设置一个标记,以便后续调用reset()方法时可以返回该位置。
- reset()方法:void reset() throws IOException。恢复到最后一次调用mark方法所在的位置。
- 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 !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。