Class CpioArchiveOutputStream

  • All Implemented Interfaces:
    java.io.Closeable, java.io.Flushable, java.lang.AutoCloseable, CpioConstants

    public class CpioArchiveOutputStream
    extends ArchiveOutputStream<CpioArchiveEntry>
    implements CpioConstants
    CpioArchiveOutputStream is a stream for writing CPIO streams. All formats of CPIO are supported (old ASCII, old binary, new portable format and the new portable format with CRC).

    An entry can be written by creating an instance of CpioArchiveEntry and fill it with the necessary values and put it into the CPIO stream. Afterwards write the contents of the file into the CPIO stream. Either close the stream by calling finish() or put a next entry into the cpio stream.

     CpioArchiveOutputStream out = new CpioArchiveOutputStream(
             new FileOutputStream(new File("test.cpio")));
     CpioArchiveEntry entry = new CpioArchiveEntry();
     entry.setName("testfile");
     String contents = "12345";
     entry.setFileSize(contents.length());
     entry.setMode(CpioConstants.C_ISREG); // regular file
     ... set other attributes, e.g. time, number of links
     out.putArchiveEntry(entry);
     out.write(testContents.getBytes());
     out.close();
     

    Note: This implementation should be compatible to cpio 2.5

    This class uses mutable fields and is not considered threadsafe.

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

    • Field Detail

      • closed

        private boolean closed
      • finished

        private boolean finished
        indicates if this archive is finished
      • names

        private final java.util.HashMap<java.lang.String,​CpioArchiveEntry> names
      • crc

        private long crc
      • written

        private long written
      • out

        private final java.io.OutputStream out
      • blockSize

        private final int blockSize
      • nextArtificalDeviceAndInode

        private long nextArtificalDeviceAndInode
      • zipEncoding

        private final ZipEncoding zipEncoding
        The encoding to use for file names and labels.
      • encoding

        final java.lang.String encoding
    • Constructor Detail

      • CpioArchiveOutputStream

        public CpioArchiveOutputStream​(java.io.OutputStream out)
        Constructs the cpio output stream. The format for this CPIO stream is the "new" format using ASCII encoding for file names
        Parameters:
        out - The cpio stream
      • CpioArchiveOutputStream

        public CpioArchiveOutputStream​(java.io.OutputStream out,
                                       short format)
        Constructs the cpio output stream with a specified format, a blocksize of BLOCK_SIZE and using ASCII as the file name encoding.
        Parameters:
        out - The cpio stream
        format - The format of the stream
      • CpioArchiveOutputStream

        public CpioArchiveOutputStream​(java.io.OutputStream out,
                                       short format,
                                       int blockSize)
        Constructs the cpio output stream with a specified format using ASCII as the file name encoding.
        Parameters:
        out - The cpio stream
        format - The format of the stream
        blockSize - The block size of the archive.
        Since:
        1.1
      • CpioArchiveOutputStream

        public CpioArchiveOutputStream​(java.io.OutputStream out,
                                       short format,
                                       int blockSize,
                                       java.lang.String encoding)
        Constructs the cpio output stream with a specified format using ASCII as the file name encoding.
        Parameters:
        out - The cpio stream
        format - The format of the stream
        blockSize - The block size of the archive.
        encoding - The encoding of file names to write - use null for the platform's default.
        Since:
        1.6
      • CpioArchiveOutputStream

        public CpioArchiveOutputStream​(java.io.OutputStream out,
                                       java.lang.String encoding)
        Constructs the cpio output stream. The format for this CPIO stream is the "new" format.
        Parameters:
        out - The cpio stream
        encoding - The encoding of file names to write - use null for the platform's default.
        Since:
        1.6
    • Method Detail

      • close

        public void close()
                   throws java.io.IOException
        Closes the CPIO output stream as well as the stream being filtered.
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Overrides:
        close in class java.io.OutputStream
        Throws:
        java.io.IOException - if an I/O error has occurred or if a CPIO file error has occurred
      • createArchiveEntry

        public CpioArchiveEntry createArchiveEntry​(java.nio.file.Path inputPath,
                                                   java.lang.String entryName,
                                                   java.nio.file.LinkOption... options)
                                            throws java.io.IOException
        Creates a new CpioArchiveEntry. The entryName must be an ASCII encoded string.
        Overrides:
        createArchiveEntry in class ArchiveOutputStream<CpioArchiveEntry>
        Parameters:
        inputPath - the file to create the entry from
        entryName - name to use for the entry
        options - options indicating how symbolic links are handled.
        Returns:
        the ArchiveEntry set up with details from the file
        Throws:
        java.io.IOException - if an I/O error occurs
        See Also:
        ArchiveOutputStream.createArchiveEntry(java.io.File, String)
      • encode

        private byte[] encode​(java.lang.String str)
                       throws java.io.IOException
        Encodes the given string using the configured encoding.
        Parameters:
        str - the String to write
        Returns:
        result of encoding the string
        Throws:
        java.io.IOException - if the string couldn't be written
      • 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
      • finish

        public void finish()
                    throws java.io.IOException
        Finishes writing the contents of the CPIO output stream without closing the underlying stream. Use this method when applying multiple filters in succession to the same output stream.
        Specified by:
        finish in class ArchiveOutputStream<CpioArchiveEntry>
        Throws:
        java.io.IOException - if an I/O exception has occurred or if a CPIO file error has occurred
      • pad

        private void pad​(int count)
                  throws java.io.IOException
        Throws:
        java.io.IOException
      • putArchiveEntry

        public void putArchiveEntry​(CpioArchiveEntry entry)
                             throws java.io.IOException
        Begins writing a new CPIO file entry and positions the stream to the start of the entry data. Closes the current entry if still active. The current time will be used if the entry has no set modification time and the default header format will be used if no other format is specified in the entry.
        Specified by:
        putArchiveEntry in class ArchiveOutputStream<CpioArchiveEntry>
        Parameters:
        entry - the CPIO cpioEntry to be written
        Throws:
        java.io.IOException - if an I/O error has occurred or if a CPIO file error has occurred
        java.lang.ClassCastException - if entry is not an instance of CpioArchiveEntry
      • write

        public void write​(byte[] b,
                          int off,
                          int len)
                   throws java.io.IOException
        Writes an array of bytes to the current CPIO entry data. This method will block until all the bytes are written.
        Overrides:
        write in class java.io.OutputStream
        Parameters:
        b - the data to be written
        off - the start offset in the data
        len - the number of bytes that are written
        Throws:
        java.io.IOException - if an I/O error has occurred or if a CPIO file error has occurred
      • writeAsciiLong

        private void writeAsciiLong​(long number,
                                    int length,
                                    int radix)
                             throws java.io.IOException
        Throws:
        java.io.IOException
      • writeBinaryLong

        private void writeBinaryLong​(long number,
                                     int length,
                                     boolean swapHalfWord)
                              throws java.io.IOException
        Throws:
        java.io.IOException
      • writeCString

        private void writeCString​(byte[] str)
                           throws java.io.IOException
        Writes an encoded string to the stream followed by \0
        Parameters:
        str - the String to write
        Throws:
        java.io.IOException - if the string couldn't be written
      • writeHeader

        private void writeHeader​(CpioArchiveEntry e)
                          throws java.io.IOException
        Throws:
        java.io.IOException
      • writeNewEntry

        private void writeNewEntry​(CpioArchiveEntry entry)
                            throws java.io.IOException
        Throws:
        java.io.IOException
      • writeOldAsciiEntry

        private void writeOldAsciiEntry​(CpioArchiveEntry entry)
                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • writeOldBinaryEntry

        private void writeOldBinaryEntry​(CpioArchiveEntry entry,
                                         boolean swapHalfWord)
                                  throws java.io.IOException
        Throws:
        java.io.IOException