Class CpioArchiveInputStream

All Implemented Interfaces:
Closeable, AutoCloseable, CpioConstants

CpioArchiveInputStream is a stream for reading cpio streams. All formats of cpio are supported (old ascii, old binary, new portable format and the new portable format with crc).

The stream can be read by extracting a cpio entry (containing all information about an entry) and afterwards reading from the stream the file specified by the entry.

 CpioArchiveInputStream cpioIn = new CpioArchiveInputStream(Files.newInputStream(Paths.get("test.cpio")));
 CpioArchiveEntry cpioEntry;

 while ((cpioEntry = cpioIn.getNextEntry()) != null) {
     System.out.println(cpioEntry.getName());
     int tmp;
     StringBuilder buf = new StringBuilder();
     while ((tmp = cpIn.read()) != -1) {
         buf.append((char) tmp);
     }
     System.out.println(buf.toString());
 }
 cpioIn.close();
 

Note: This implementation should be compatible to cpio 2.5

This class uses mutable fields and is not considered to be threadsafe.

Based on code from the jRPM project (jrpm.sourceforge.net)

  • Constructor Details

    • CpioArchiveInputStream

      Constructs the cpio input stream with a blocksize of BLOCK_SIZE and expecting ASCII file names.
      Parameters:
      in - The cpio stream
    • CpioArchiveInputStream

      public CpioArchiveInputStream(InputStream in, int blockSize)
      Constructs the cpio input stream with a blocksize of BLOCK_SIZE expecting ASCII file names.
      Parameters:
      in - The cpio stream
      blockSize - The block size of the archive.
      Since:
      1.5
    • CpioArchiveInputStream

      public CpioArchiveInputStream(InputStream in, int blockSize, String encoding)
      Constructs the cpio input stream with a blocksize of BLOCK_SIZE.
      Parameters:
      in - The cpio stream
      blockSize - The block size of the archive.
      encoding - The encoding of file names to expect - use null for the platform's default.
      Throws:
      IllegalArgumentException - if blockSize is not bigger than 0
      Since:
      1.6
    • CpioArchiveInputStream

      public CpioArchiveInputStream(InputStream in, String encoding)
      Constructs the cpio input stream with a blocksize of BLOCK_SIZE.
      Parameters:
      in - The cpio stream
      encoding - The encoding of file names to expect - use null for the platform's default.
      Since:
      1.6
  • Method Details

    • matches

      public static boolean matches(byte[] signature, int length)
      Checks if the signature matches one of the following magic values: Strings: "070701" - MAGIC_NEW "070702" - MAGIC_NEW_CRC "070707" - MAGIC_OLD_ASCII Octal Binary value: 070707 - MAGIC_OLD_BINARY (held as a short) = 0x71C7 or 0xC771
      Parameters:
      signature - data to match
      length - length of data
      Returns:
      whether the buffer seems to contain CPIO data
    • available

      public int available() throws IOException
      Returns 0 after EOF has reached for the current entry data, otherwise always return 1.

      Programs should not count on this method to return the actual number of bytes that could be read without blocking.

      Overrides:
      available in class FilterInputStream
      Returns:
      1 before EOF and 0 after EOF has reached for current entry.
      Throws:
      IOException - if an I/O error has occurred or if a CPIO file error has occurred
    • close

      public void close() throws IOException
      Closes the CPIO input stream.
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Overrides:
      close in class FilterInputStream
      Throws:
      IOException - if an I/O error has occurred
    • getNextCPIOEntry

      Deprecated.
      Reads the next CPIO file entry and positions stream at the beginning of the entry data.
      Returns:
      the CpioArchiveEntry just read
      Throws:
      IOException - if an I/O error has occurred or if a CPIO file error has occurred
    • getNextEntry

      Description copied from class: ArchiveInputStream
      Gets the next Archive Entry in this Stream.
      Specified by:
      getNextEntry in class ArchiveInputStream<CpioArchiveEntry>
      Returns:
      the next entry, or null if there are no more entries.
      Throws:
      IOException - if the next entry could not be read.
    • read

      public int read(byte[] b, int off, int len) throws IOException
      Reads from the current CPIO entry into an array of bytes. Blocks until some input is available.
      Overrides:
      read in class FilterInputStream
      Parameters:
      b - the buffer into which the data is read
      off - the start offset of the data
      len - the maximum number of bytes read
      Returns:
      the actual number of bytes read, or -1 if the end of the entry is reached
      Throws:
      IOException - if an I/O error has occurred or if a CPIO file error has occurred
    • skip

      public long skip(long n) throws IOException
      Skips specified number of bytes in the current CPIO entry.
      Overrides:
      skip in class FilterInputStream
      Parameters:
      n - the number of bytes to skip
      Returns:
      the actual number of bytes skipped
      Throws:
      IOException - if an I/O error has occurred
      IllegalArgumentException - if n < 0