org.apache.commons.compress.archivers.cpio
Class CpioArchiveInputStream

java.lang.Object
  extended by java.io.InputStream
      extended by org.apache.commons.compress.archivers.ArchiveInputStream
          extended by org.apache.commons.compress.archivers.cpio.CpioArchiveInputStream
All Implemented Interfaces:
java.io.Closeable, CpioConstants

public class CpioArchiveInputStream
extends ArchiveInputStream
implements 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 informations about a entry) and afterwards reading from the stream the file specified by the entry.

 CPIOArchiveInputStream cpioIn = new CPIOArchiveInputStream(
         new FileInputStream(new File("test.cpio")));
 CPIOArchiveEntry cpioEntry;
 

while ((cpioEntry = cpioIn.getNextEntry()) != null) { System.out.println(cpioEntry.getName()); int tmp; StringBuffer buf = new StringBuffer(); 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)


Field Summary
private  boolean closed
           
private  long crc
           
private  CpioArchiveEntry entry
           
private  long entryBytesRead
           
private  boolean entryEOF
           
private  java.io.InputStream in
           
private  byte[] tmpbuf
           
 
Fields inherited from interface org.apache.commons.compress.archivers.cpio.CpioConstants
BLOCK_SIZE, C_IRGRP, C_IROTH, C_IRUSR, C_ISBLK, C_ISCHR, C_ISDIR, C_ISFIFO, C_ISGID, C_ISLNK, C_ISNWK, C_ISREG, C_ISSOCK, C_ISUID, C_ISVTX, C_IWGRP, C_IWOTH, C_IWUSR, C_IXGRP, C_IXOTH, C_IXUSR, CPIO_TRAILER, FORMAT_NEW, FORMAT_NEW_CRC, FORMAT_NEW_MASK, FORMAT_OLD_ASCII, FORMAT_OLD_BINARY, FORMAT_OLD_MASK, MAGIC_NEW, MAGIC_NEW_CRC, MAGIC_OLD_ASCII, MAGIC_OLD_BINARY, S_IFMT
 
Constructor Summary
CpioArchiveInputStream(java.io.InputStream in)
          Construct the cpio input stream
 
Method Summary
 int available()
          Returns 0 after EOF has reached for the current entry data, otherwise always return 1.
 void close()
          Closes the CPIO input stream.
private  void closeEntry()
          Closes the current CPIO entry and positions the stream for reading the next entry.
private  void ensureOpen()
          Check to make sure that this stream has not been closed
 CpioArchiveEntry getNextCPIOEntry()
          Reads the next CPIO file entry and positions stream at the beginning of the entry data.
 ArchiveEntry getNextEntry()
          Returns the next Archive Entry in this Stream.
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
 int read(byte[] b, int off, int len)
          Reads from the current CPIO entry into an array of bytes.
private  long readAsciiLong(int length, int radix)
           
private  long readBinaryLong(int length, boolean swapHalfWord)
           
private  java.lang.String readCString(int length)
           
private  int readFully(byte[] b, int off, int len)
           
private  CpioArchiveEntry readNewEntry(boolean hasCrc)
           
private  CpioArchiveEntry readOldAsciiEntry()
           
private  CpioArchiveEntry readOldBinaryEntry(boolean swapHalfWord)
           
private  void skip(int bytes)
           
 long skip(long n)
          Skips specified number of bytes in the current CPIO entry.
 
Methods inherited from class org.apache.commons.compress.archivers.ArchiveInputStream
canReadEntryData, count, count, getBytesRead, getCount, pushedBackBytes, read
 
Methods inherited from class java.io.InputStream
mark, markSupported, read, reset
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

closed

private boolean closed

entry

private CpioArchiveEntry entry

entryBytesRead

private long entryBytesRead

entryEOF

private boolean entryEOF

tmpbuf

private final byte[] tmpbuf

crc

private long crc

in

private final java.io.InputStream in
Constructor Detail

CpioArchiveInputStream

public CpioArchiveInputStream(java.io.InputStream in)
Construct the cpio input stream

Parameters:
in - The cpio stream
Method Detail

available

public int available()
              throws java.io.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 java.io.InputStream
Returns:
1 before EOF and 0 after EOF has reached for current entry.
Throws:
java.io.IOException - if an I/O error has occurred or if a CPIO file error has occurred

close

public void close()
           throws java.io.IOException
Closes the CPIO input stream.

Specified by:
close in interface java.io.Closeable
Overrides:
close in class java.io.InputStream
Throws:
java.io.IOException - if an I/O error has occurred

closeEntry

private void closeEntry()
                 throws java.io.IOException
Closes the current CPIO entry and positions the stream for reading the next entry.

Throws:
java.io.IOException - if an I/O error has occurred or if a CPIO file error has occurred

ensureOpen

private void ensureOpen()
                 throws java.io.IOException
Check to make sure that this stream has not been closed

Throws:
java.io.IOException - if the stream is already closed

getNextCPIOEntry

public CpioArchiveEntry getNextCPIOEntry()
                                  throws java.io.IOException
Reads the next CPIO file entry and positions stream at the beginning of the entry data.

Returns:
the CPIOArchiveEntry just read
Throws:
java.io.IOException - if an I/O error has occurred or if a CPIO file error has occurred

skip

private void skip(int bytes)
           throws java.io.IOException
Throws:
java.io.IOException

read

public int read(byte[] b,
                int off,
                int len)
         throws java.io.IOException
Reads from the current CPIO entry into an array of bytes. Blocks until some input is available.

Overrides:
read in class java.io.InputStream
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:
java.io.IOException - if an I/O error has occurred or if a CPIO file error has occurred

readFully

private final int readFully(byte[] b,
                            int off,
                            int len)
                     throws java.io.IOException
Throws:
java.io.IOException

readBinaryLong

private long readBinaryLong(int length,
                            boolean swapHalfWord)
                     throws java.io.IOException
Throws:
java.io.IOException

readAsciiLong

private long readAsciiLong(int length,
                           int radix)
                    throws java.io.IOException
Throws:
java.io.IOException

readNewEntry

private CpioArchiveEntry readNewEntry(boolean hasCrc)
                               throws java.io.IOException
Throws:
java.io.IOException

readOldAsciiEntry

private CpioArchiveEntry readOldAsciiEntry()
                                    throws java.io.IOException
Throws:
java.io.IOException

readOldBinaryEntry

private CpioArchiveEntry readOldBinaryEntry(boolean swapHalfWord)
                                     throws java.io.IOException
Throws:
java.io.IOException

readCString

private java.lang.String readCString(int length)
                              throws java.io.IOException
Throws:
java.io.IOException

skip

public long skip(long n)
          throws java.io.IOException
Skips specified number of bytes in the current CPIO entry.

Overrides:
skip in class java.io.InputStream
Parameters:
n - the number of bytes to skip
Returns:
the actual number of bytes skipped
Throws:
java.io.IOException - if an I/O error has occurred
java.lang.IllegalArgumentException - if n < 0

getNextEntry

public ArchiveEntry getNextEntry()
                          throws java.io.IOException
Returns the next Archive Entry in this Stream.

Specified by:
getNextEntry in class ArchiveInputStream
Returns:
the next entry, or null if there are no more entries
Throws:
java.io.IOException - if the next entry could not be read

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