Module java.base
Package javax.crypto

Class CipherInputStream

所有已实现的接口:
Closeable, AutoCloseable

public class CipherInputStream extends FilterInputStream
一个CipherInputStream由一个InputStream和一个Cipher对象组成,以便read()方法返回从底层InputStream读取的数据,但这些数据还经过Cipher对象的额外处理。在被CipherInputStream使用之前,Cipher对象必须完全初始化。

例如,如果Cipher对象被初始化用于解密,CipherInputStream将尝试读取数据并解密它们,然后返回解密后的数据。

这个类严格遵循其祖先类java.io.FilterInputStreamjava.io.InputStream的语义,特别是失败的语义。这个类恰好具有其祖先类中指定的那些方法,并对它们进行了覆盖。此外,这个类捕获了所有不是由其祖先类抛出的异常。特别是,skip方法跳过,available方法仅计算已被封装的Cipher对象处理的数据。这个类可能会捕获由解密期间失败的完整性检查抛出的BadPaddingException和其他异常。这些异常不会被重新抛出,因此客户端可能不会被告知完整性检查失败。由于这种行为,这个类可能不适合在受身份验证模式(例如GCM)下进行解密的应用。需要经过身份验证的加密的应用程序可以直接使用Cipher API作为使用这个类的替代方法。

对于使用这个类的程序员来说,重要的是不要使用在这个类中未定义或未覆盖的方法(例如稍后添加到其中一个超类的新方法或构造函数),因为这些方法的设计和实现不太可能考虑到CipherInputStream的安全影响。

自从:
1.4
参见:
  • Constructor Details

    • CipherInputStream

      public CipherInputStream(InputStream is, Cipher c)
      从一个InputStream和一个Cipher对象构造一个CipherInputStream
      注意:如果指定的输入流或密码是null,则稍后在使用它们时可能会抛出NullPointerException
      参数:
      is - 要处理的输入流
      c - 一个已初始化的Cipher对象
    • CipherInputStream

      protected CipherInputStream(InputStream is)
      从一个InputStream构造一个CipherInputStream,而不指定Cipher对象。这将导致使用NullCipher构造一个CipherInputStream
      注意:如果指定的输入流是null,则稍后在使用它时可能会抛出NullPointerException
      参数:
      is - 要处理的输入流
  • Method Details

    • read

      public int read() throws IOException
      从这个输入流中读取下一个字节的数据。值字节作为int在范围0255返回。如果没有字节可用,因为已到达流的末尾,则返回值-1。此方法将阻塞,直到有输入数据可用,检测到流的末尾,或抛出异常。
      覆盖:
      read 在类 FilterInputStream
      返回:
      下一个数据字节,如果到达流的末尾则返回-1
      抛出:
      IOException - 如果发生I/O错误。
      参见:
    • read

      public int read(byte[] b) throws IOException
      从这个输入流中读取最多b.length字节的数据到一个字节数组中。

      InputStreamread方法调用带有参数b0b.length的三个参数的read方法。

      覆盖:
      read 在类 FilterInputStream
      参数:
      b - 数据读入的缓冲区。
      返回:
      读入缓冲区的总字节数,如果没有更多数据因为已到达流的末尾,则返回-1
      抛出:
      IOException - 如果发生I/O错误。
      参见:
    • read

      public int read(byte[] b, int off, int len) throws IOException
      从这个输入流中读取最多len字节的数据到一个字节数组中。此方法将阻塞,直到有一些输入可用。如果第一个参数是null,则读取并丢弃最多len字节。
      覆盖:
      read 在类 FilterInputStream
      参数:
      b - 数据读入的缓冲区。
      off - 目标数组buf中的起始偏移量。
      len - 最大读取字节数。
      返回:
      读入缓冲区的总字节数,如果没有更多数据因为已到达流的末尾,则返回-1
      抛出:
      IOException - 如果发生I/O错误。
      参见:
    • skip

      public long skip(long n) throws IOException
      跳过可以从这个输入流中读取而不阻塞的字节中的n个字节。

      可能会跳过比请求的更少的字节。实际跳过的字节数等于n或调用available的结果,以较小者为准。如果n小于零,则不会跳过任何字节。

      返回实际跳过的字节数。

      覆盖:
      skip 在类 FilterInputStream
      参数:
      n - 要跳过的字节数。
      返回:
      实际跳过的字节数。
      抛出:
      IOException - 如果发生I/O错误。
      参见:
    • available

      public int available() throws IOException
      返回可以从这个输入流中读取而不阻塞的字节数。 InputStreamavailable方法返回0。这个方法应该被子类覆盖。
      覆盖:
      available 在类 FilterInputStream
      返回:
      可以从这个输入流中读取而不阻塞的字节数。
      抛出:
      IOException - 如果发生I/O错误。
    • close

      public void close() throws IOException
      关闭这个输入流并释放与流相关的任何系统资源。

      CipherInputStreamclose方法调用其基础输入流的close方法。

      指定者:
      close 在接口 AutoCloseable
      指定者:
      close 在接口 Closeable
      覆盖:
      close 在类 FilterInputStream
      抛出:
      IOException - 如果发生 I/O 错误。
      参见:
    • markSupported

      public boolean markSupported()
      测试此输入流是否支持markreset方法,但它不支持。
      覆盖:
      markSupported 在类 FilterInputStream
      返回:
      false,因为此类不支持markreset方法。
      参见: