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();
在这里,我们就能获得解密后的数据了。这个加密数据如何写进文件呢?将在后面展示。