(每日持续更新)jdk api之FilterInputStream基础、应用、实战

发布时间:2024年01月21日

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】

一、java.io

1.25 FilterInputStream

FilterInputStream 是 Java I/O 中用于提供过滤功能的抽象基类,它继承自 InputStreamFilterInputStream 本身并没有添加新的方法,但它可以作为其他输入流的包装器,通过添加过滤功能来修改输入流的行为。

FilterInputStream 介绍:

FilterInputStream 提供了一个通用的框架,可用于实现输入流的过滤器。过滤器是输入流的派生类,通过在读取数据之前或之后对数据进行处理来修改其行为。FilterInputStream 的派生类通常会覆盖其中的一些方法,以实现特定的过滤逻辑。

FilterInputStream 所有字段:

FilterInputStream 类没有公共字段。

FilterInputStream 构造方法:

FilterInputStream 的构造方法主要是通过将其他输入流作为参数传递来创建过滤器。以下是构造方法:

  • protected FilterInputStream(InputStream in) 创建一个新的 FilterInputStream,给定要进行过滤的基础输入流。

FilterInputStream 方法摘要:

FilterInputStream 类继承了 InputStream 的所有方法,但没有添加新的方法。以下是一些常用的方法:

  • int read() 读取单个字节的数据。

  • int read(byte[] b) 从输入流中读取一些字节数,并将它们存储到字节数组 b 中。

  • int read(byte[] b, int off, int len) 从输入流中读取最多 len 个字节的数据,并将其存储到字节数组 b 中,从偏移量 off 开始。

  • long skip(long n) 跳过输入流中的 n 个字节。

  • int available() 返回可从输入流中读取而不受阻塞的字节数。

  • void close() 关闭输入流。

简单使用例子:

以下是一个简单的例子,演示如何使用 FilterInputStream 的一个具体子类 BufferedInputStream 进行输入流的缓冲:

javaCopy code
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
?
public class BufferedInputStreamExample {
?
 ?  public static void main(String[] args) {
 ? ? ?  try (InputStream fileInputStream = new FileInputStream("example.txt");
 ? ? ? ? ? ? InputStream bufferedInputStream = new BufferedInputStream(fileInputStream)) {
?
 ? ? ? ? ?  // 通过缓冲输入流读取数据
 ? ? ? ? ?  int data;
 ? ? ? ? ?  while ((data = bufferedInputStream.read()) != -1) {
 ? ? ? ? ? ? ?  System.out.print((char) data);
 ? ? ? ? ?  }
?
 ? ? ?  } catch (IOException e) {
 ? ? ? ? ?  e.printStackTrace();
 ? ? ?  }
 ?  }
}

在这个例子中,我们使用 BufferedInputStreamFileInputStream 进行了包装。BufferedInputStreamFilterInputStream 的一个子类,它通过在内存中创建一个缓冲区来提高输入流的性能。通过使用过滤器,我们可以更方便地添加额外的功能,而不改变基础输入流的行为。

应用场景

FilterInputStream 主要用于实现输入流的过滤功能,以下是一些应用场景和相应的代码实现:

1. 缓冲输入流:
  • 场景: 提高输入流的性能,避免每次读取都直接操作文件。

  • 代码实现:

    javaCopy code
    try (InputStream fileInputStream = new FileInputStream("example.txt");
     ? ? InputStream bufferedInputStream = new BufferedInputStream(fileInputStream)) {
    ?
     ?  // 使用缓冲输入流读取数据
     ?  int data;
     ?  while ((data = bufferedInputStream.read()) != -1) {
     ? ? ?  System.out.print((char) data);
     ?  }
    ?
    } catch (IOException e) {
     ?  e.printStackTrace();
    }
2. 解析基本数据类型:
  • 场景: 从输入流中读取基本数据类型的值,如 intfloat 等。

  • 代码实现:

    javaCopy code
    try (DataInputStream dataInputStream = new DataInputStream(new FileInputStream("data.bin"))) {
    ?
     ?  // 从数据流中读取整数
     ?  int intValue = dataInputStream.readInt();
     ?  System.out.println("Read integer value: " + intValue);
    ?
    } catch (IOException e) {
     ?  e.printStackTrace();
    }
3. 加密输入流:
  • 场景: 对输入流中的数据进行加密处理。

  • 代码实现:

    javaCopy code
    try (InputStream fileInputStream = new FileInputStream("encrypted_data.bin");
     ? ? InputStream encryptedInputStream = new MyEncryptionFilterInputStream(fileInputStream)) {
    ?
     ?  // 读取经过加密的数据
     ?  int data;
     ?  while ((data = encryptedInputStream.read()) != -1) {
     ? ? ?  System.out.print((char) data);
     ?  }
    ?
    } catch (IOException e) {
     ?  e.printStackTrace();
    }
4. 自定义过滤器:
  • 场景: 实现自定义的输入流过滤器以满足特定需求。

  • 代码实现:

    javaCopy code
    class MyFilterInputStream extends FilterInputStream {
     ?  // 自定义过滤器的实现...
    ?
     ?  MyFilterInputStream(InputStream in) {
     ? ? ?  super(in);
     ?  }
    }
    ?
    // 在代码中使用自定义的过滤器
    try (InputStream fileInputStream = new FileInputStream("example.txt");
     ? ? InputStream customFilterInputStream = new MyFilterInputStream(fileInputStream)) {
    ?
     ?  // 使用自定义过滤器读取数据
     ?  int data;
     ?  while ((data = customFilterInputStream.read()) != -1) {
     ? ? ?  System.out.print((char) data);
     ?  }
    ?
    } catch (IOException e) {
     ?  e.printStackTrace();
    }
5. 计算校验和:
  • 场景: 在读取数据时计算数据的校验和。

  • 代码实现:

    javaCopy code
    try (InputStream fileInputStream = new FileInputStream("data.txt");
     ? ? InputStream checksumInputStream = new ChecksumFilterInputStream(fileInputStream)) {
    ?
     ?  // 读取数据并计算校验和
     ?  int data;
     ?  while ((data = checksumInputStream.read()) != -1) {
     ? ? ?  // 处理数据,同时更新校验和
     ?  }
    ?
     ?  long checksumValue = ((ChecksumFilterInputStream) checksumInputStream).getChecksum();
     ?  System.out.println("Checksum value: " + checksumValue);
    ?
    } catch (IOException e) {
     ?  e.printStackTrace();
    }

这些例子展示了在不同场景下使用 FilterInputStream 的一些常见用法。在实际应用中,具体的使用方式取决于需求和对输入流的定制化需求。

实战例子

在一个实际项目中,使用 FilterInputStream 的场景可能涉及到一些特定的需求,比如数据解析、加密、压缩等。以下是一个简单的项目实战例子,演示如何使用 FilterInputStream 的子类 CipherInputStream 来进行文件解密。

项目要求:
  1. 有一个加密的文件 encrypted_data.bin,需要将其解密并保存到新文件 decrypted_data.txt 中。

  2. 使用对称加密算法对文件进行解密,例如 AES。

  3. 使用 CipherInputStream 进行文件解密。

项目实战代码:
javaCopy code
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
?
public class FileDecryptionProject {
?
 ?  public static void main(String[] args) {
 ? ? ?  String encryptedFile = "encrypted_data.bin";
 ? ? ?  String decryptedFile = "decrypted_data.txt";
 ? ? ?  String secretKey = "MySecretKey123"; // Replace with your secret key
?
 ? ? ?  try {
 ? ? ? ? ?  // 创建对称密钥
 ? ? ? ? ?  SecretKey key = new SecretKeySpec(secretKey.getBytes(), "AES");
?
 ? ? ? ? ?  // 创建Cipher对象并初始化为解密模式
 ? ? ? ? ?  Cipher cipher = Cipher.getInstance("AES");
 ? ? ? ? ?  cipher.init(Cipher.DECRYPT_MODE, key);
?
 ? ? ? ? ?  // 使用CipherInputStream进行文件解密
 ? ? ? ? ?  try (FileInputStream fileInputStream = new FileInputStream(encryptedFile);
 ? ? ? ? ? ? ? ? CipherInputStream cipherInputStream = new CipherInputStream(fileInputStream, cipher);
 ? ? ? ? ? ? ? ? FileOutputStream fileOutputStream = new FileOutputStream(decryptedFile)) {
?
 ? ? ? ? ? ? ?  // 读取解密后的数据并保存到新文件
 ? ? ? ? ? ? ?  byte[] buffer = new byte[4096];
 ? ? ? ? ? ? ?  int bytesRead;
 ? ? ? ? ? ? ?  while ((bytesRead = cipherInputStream.read(buffer)) != -1) {
 ? ? ? ? ? ? ? ? ?  fileOutputStream.write(buffer, 0, bytesRead);
 ? ? ? ? ? ? ?  }
?
 ? ? ? ? ? ? ?  System.out.println("File decrypted successfully.");
?
 ? ? ? ? ?  } catch (IOException e) {
 ? ? ? ? ? ? ?  e.printStackTrace();
 ? ? ? ? ?  }
?
 ? ? ?  } catch (Exception e) {
 ? ? ? ? ?  e.printStackTrace();
 ? ? ?  }
 ?  }
}

在这个例子中,我们使用了 CipherInputStreamFileInputStream 进行包装,以实现文件的解密操作。请注意,这里使用的是对称密钥加密算法(AES),并且密钥是硬编码在代码中,实际应用中应该更安全地管理密钥。在真实项目中,可能还需要考虑异常处理、日志记录等方面的更多细节。

文章来源:https://blog.csdn.net/a89879193/article/details/135733242
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。