3.3.6 CipherInputStream

CipherInputStream和CipherOutputStream同属Cipher类的扩展,统称为密钥流。按流的输入和输出方式分为密钥输入流和密钥输出流。


//提供密钥输入流

public class CipherInputStream

extends FilterInputStream


❑方法详述

可通过如下构造方法构造实例化对象:


//根据InputStream和Cipher构造CipherInputStream对象。

public CipherInputStream(InputStream is, Cipher c)


CipherInputStream类覆盖了FilterInputStream类的以下方法。

以下是输入流的读操作,与一般FilterInputStream的子类别无二致:


//从该输入流读取下一数据字节。

public int read()

//从该输入流将b.length个数据字节读入到字节数组中。

public int read(byte[]b)

//从该输入流将len个字节数据读入到字节数组中。

public int read(byte[]b, int off, int len)


通常,我们可以通过如下方法获知是否还有可读入内容:


//返回不发生阻塞地从此输入流读取的字节数。

public int available()


或者,直接跳过某些内容,方法如下所示:


//跳过不发生阻塞地从该输入流读取的字节中的n个字节的输入。

public long skip(long n)


我们可以通过如下方法验证该输入流是否支持标记和重置操作:


//测试该输入流是否支持mark和reset方法以及哪一种方法确实不受支持。

public boolean markSupported()


完成操作后,一定要执行关闭流操作,方法如下所示:


//关闭该输入流并释放任何与该流关联的系统资源。

public void close()


❑实现示例

我们通过如下代码来展示如何使用密钥输入流解密文件中的数据。

首先,构建Cipher实例化对象:


//实例化KeyGenerator对象,指定DES算法。

KeyGenerator kg=KeyGenerator.getInstance("DES");

//生成SecretKey对象

SecretKey secretKey=kg.generateKey();

//实例化Cipher对象

Cipher cipher=Cipher.getInstance("DES");


接着我们从文件中读入数据,然后进行解密操作:


//初始化Cipher对象,用于解密操作。

cipher.init(Cipher.DECRYPT_MODE, secretKey);

//实例化CipherInputStream对象。

CipherInputStream cis=new CipherInputStream(new FileInputStream(new

File("secret")),cipher);

//使用DataInputStream对象包装CipherInputStream对象。

DataInputStream dis=new DataInputStream(cis);

//读出解密后的数据

String output=dis.readUTF();

//关闭流

dis.close();


在这里,我们就能获得解密后的数据了。这个加密数据如何写进文件呢?将在后面展示。