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

博主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),并且密钥是硬编码在代码中,实际应用中应该更安全地管理密钥。在真实项目中,可能还需要考虑异常处理、日志记录等方面的更多细节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/638603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis常用命令指令、描述及简单举例

指令 描述 举例 set 存入单个数据 set number 1 setex 存入并设置过期时间 setex key 30 value setnx 不存在则存入,实现分布式锁 setnx key value msetnx 不存在则批量存入,原子性操作 msetnx key1 value1 key2 value2 有一个key存在则整个语句插入失败…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-7 datalist

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>datalist</title> </head><body> <input id"address" list"addressList"> <datalist id"addressList"…

Web3艺术市场:NFT与数字创作的结合

在数字时代&#xff0c;随着区块链技术的崛起&#xff0c;一种新型数字资产&#xff0c;非同质化代币&#xff08;NFT&#xff09;&#xff0c;正逐渐改变传统艺术市场的格局。这种数字化的艺术品售卖方式成为了Web3艺术市场的代表&#xff0c;推动着数字创作与艺术市场的结合。…

【C++干货铺】C++11新特性——右值引用、移动构造、完美转发

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 左值与左值引用 右值与右值引用 左值引用和右值引用的比较 左值引用总结&#xff1a; 右值引用总结&#xff1a; 左值引用的作用和意义 右值引用的使用场景和…

C++ 学习系列 -- std::function 与 std::bind

一 std::function 与 std::bind 的介绍 1. std::function std::function 是 c 11 的新特性 &#xff0c;包含在头文件<functional>中&#xff0c;为了更方便的调用函数而引入。 std::function 是一个函数包装器&#xff08;function wrapper&#xff09;&#xff0c;…

5.6 BCC工具之bitehist解读

一,bitehist简介 bitehist工具可以为我们生成Block I/O 大小的直方分步图。 二,代码示例 2.1 代码 #!/usr/bin/python from __future__ import print_function from bcc import BPF from time import sleep # load BPF program b = BPF(text=""" #include …

常见荣誉奖励英文翻译

文章目录 常见校内奖学金中英文对照表常见社会奖学金中英文对照表 常见校内奖学金中英文对照表 这篇博客旨在为读者提供一份详尽的常见校内奖学金中英文对照表&#xff0c;为学术界和学生群体提供便捷的参考工具。随着留学和学术竞争的不断加剧&#xff0c;了解和申请奖学金变…

CHAPTER 11: 《DESIGN A NEWS FEED SYSTEM》 第 11 章:《设计新闻系统》

在本章中&#xff0c;您将被要求设计一个新闻提要系统。什幺是新闻系统&#xff1f;根据Facebook 页面&#xff0c;“News feed 是中间不断更新的故事列表。您的主页。动态消息包括状态更新、照片、视频、链接、应用活动记录和喜欢您在 Facebook 上关注的人、页面和群组“[1]。…

Mysql运维篇(三) MySQL数据库分库分表方案

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人&#xff0c;如有侵权请留言&#xff0c;我及时删除。 一、前言 关系型数据库本身比较容易成为系统瓶颈&#xff0c;单机存储容量、连接数、处理能力都有限。当单表的数…

磁盘的分区与文件系统的认识

磁盘的认识 了解磁盘的结构&#xff1a; 1、盘片 硬盘首先会有多个盘片构成&#xff0c;类似很多个独立的光盘合并在一起&#xff0c;每个盘片都有2个面&#xff0c;每个盘片都有一个对应的磁头&#xff0c;我们的磁头横移和盘面的旋转就可以读写到盘面的每一个位置&#xff0c…

SQLServer CROSS APPLY使用

在 SQL Server 中&#xff0c;CROSS APPLY 是一个用于将一个表值函数或子查询与一个表相关联的运算符。它类似于其他数据库系统中的 OUTER APPLY 运算符&#xff0c;但返回所有行&#xff0c;即使子查询结果为空。 使用 CROSS APPLY 可以将一个表值函数或子查询应用于另一个表…

08. 面向对象编程(二)

目录 1、前言 2、多重继承 2.1、潜在的问题 3、Property 4、staticmethod 5、运算符重载 5.1、加法运算符 的重载 5.2、字符串表示运算符 str() 的重载 5.3、索引运算符 [] 的重载 6、小结 1、前言 上一篇文章中&#xff0c;我们介绍了面向对象编程的类和实例&…

javascript设计模式-装饰者

装饰者 基本实现 是一种为对象增加我的技术&#xff0c;它并不使用创建新子类手段&#xff0c;一切都在动态完成。这个过程相对于使用者来说是透明的。透明地把对象包装在具有同样接口的另一个对象之中。 比如可以动态的为自行车对象添加可选的特色配件上。比如添加4个选件&…

v35-36.problems

1.size of&#xff08;&#xff09;运算符 根据c语言标准规范&#xff0c;Size of&#xff08;&#xff09; 里面的操作数如果不是可变长度数组类型 &#xff0c;那么此操作数就不会被执行 &#xff01;

x-cmd pkg | skate - 个人键值对存储工具

目录 简介用户首次快速实验指南功能特点竞品和相关作品进一步探索 简介 skate 是个人键值对存储工具&#xff0c;具备数据加密、云端数据备份以及多设备同步等功能。 它由 Charm 团队开发&#xff0c;借用 Charm Cloud 向用户提供一种快捷的方式来保存和检索各种数据&#xf…

零基础学习【Linux】这一篇就够了

Linux学习目录 1. Linux简介1-1. Linux系统版本 2. Linux安装2-1. 安装方式2-2. Vmware安装2-3. Linux安装2-4. Vmware克隆2-5. Vmware快照2-6. 连接工具安装 3. Linux常用命令4. Linux软件安装5. 项目部署 1. Linux简介 1-1. Linux系统版本 Linux系统分为内核版和发行版 内核…

在线检测和离线检测的区别?

问题描述&#xff1a;在线检测和离线检测的区别&#xff1f; 问题解答&#xff1a; "在线检测"和"离线检测"是两种不同的数据或系统处理方式&#xff0c;主要区别在于处理的时机和方式&#xff1a; 在线检测&#xff08;Online Detection&#xff09;&am…

什么是UML?有什么用?

2、什么是UML?有什么用&#xff1f; UML 是 Unified Model Language的缩写&#xff0c;中文是统一建模语言&#xff0c;是由一整套图表组成的标准化建模语言。 UML 是一种统一建模语言&#xff0c;一种图标式语言&#xff08;画图的&#xff09; UML 不是只有 Java 中使用&…

Unity开发授权系统

Unity开发授权系统 引子 因为有些客户尾款到账不及时&#xff0c;因此研究了一套授权系统&#xff0c;当授权到期后&#xff0c;系统就提示软件授权已到期&#xff0c;不能继续使用云云&#xff0c;这样方便尾款的收回。 大体需求就是 时间相关性&#xff0c;可以自由设置授…

「斗破年番」大紫研爆虐六星斗皇,佛怒火连回归,异火焚烧分身

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《斗破苍穹年番》第80期超前爆料&#xff0c;据透露韩枫以海心焰这一异火贡献给了慕骨老人&#xff0c;换取了一具斗宗躯体。通过灵魂融入&#xff0c;他成功达到了斗宗四星阶段。而与小医仙对决的莫天行&#xff0c;尽管两人实力…