Class ArArchiveInputStream

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

    public class ArArchiveInputStream
    extends ArchiveInputStream
    Implements the "ar" archive format as an input stream.
    • Constructor Detail

      • ArArchiveInputStream

        public ArArchiveInputStream​(java.io.InputStream pInput)
        Constructs an Ar input stream with the referenced stream
        Parameters:
        pInput - the ar input stream
    • Method Detail

      • getNextArEntry

        public ArArchiveEntry getNextArEntry()
                                      throws java.io.IOException
        Returns the next AR entry in this stream.
        Returns:
        the next AR entry.
        Throws:
        java.io.IOException - if the entry could not be read
      • getExtendedName

        private java.lang.String getExtendedName​(int offset)
                                          throws java.io.IOException
        Get an extended name from the GNU extended name buffer.
        Parameters:
        offset - pointer to entry within the buffer
        Returns:
        the extended file name; without trailing "/" if present.
        Throws:
        java.io.IOException - if name not found or buffer not set up
      • asLong

        private long asLong​(byte[] byteArray,
                            int offset,
                            int len)
      • asInt

        private int asInt​(byte[] byteArray,
                          int offset,
                          int len)
      • asInt

        private int asInt​(byte[] byteArray,
                          int offset,
                          int len,
                          boolean treatBlankAsZero)
      • asInt

        private int asInt​(byte[] byteArray,
                          int offset,
                          int len,
                          int base)
      • asInt

        private int asInt​(byte[] byteArray,
                          int offset,
                          int len,
                          int base,
                          boolean treatBlankAsZero)
      • getNextEntry

        public ArchiveEntry getNextEntry()
                                  throws java.io.IOException
        Description copied from class: ArchiveInputStream
        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
      • close

        public void close()
                   throws java.io.IOException
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Overrides:
        close in class java.io.InputStream
        Throws:
        java.io.IOException
      • read

        public int read​(byte[] b,
                        int off,
                        int len)
                 throws java.io.IOException
        Overrides:
        read in class java.io.InputStream
        Throws:
        java.io.IOException
      • matches

        public static boolean matches​(byte[] signature,
                                      int length)
        Checks if the signature matches ASCII "!<arch>" followed by a single LF control character
        Parameters:
        signature - the bytes to check
        length - the number of bytes to check
        Returns:
        true, if this stream is an Ar archive stream, false otherwise
      • isBSDLongName

        private static boolean isBSDLongName​(java.lang.String name)
        Does the name look like it is a long name (or a name containing spaces) as encoded by BSD ar?

        From the FreeBSD ar(5) man page:

         BSD   In the BSD variant, names that are shorter than 16
               characters and without embedded spaces are stored
               directly in this field.  If a name has an embedded
               space, or if it is longer than 16 characters, then
               the string "#1/" followed by the decimal represen-
               tation of the length of the file name is placed in
               this field. The actual file name is stored immedi-
               ately after the archive header.  The content of the
               archive member follows the file name.  The ar_size
               field of the header (see below) will then hold the
               sum of the size of the file name and the size of
               the member.
         
        Since:
        1.3
      • getBSDLongName

        private java.lang.String getBSDLongName​(java.lang.String bsdLongName)
                                         throws java.io.IOException
        Reads the real name from the current stream assuming the very first bytes to be read are the real file name.
        Throws:
        java.io.IOException
        Since:
        1.3
        See Also:
        isBSDLongName(java.lang.String)
      • isGNUStringTable

        private static boolean isGNUStringTable​(java.lang.String name)
        Is this the name of the "Archive String Table" as used by SVR4/GNU to store long file names?

        GNU ar stores multiple extended file names in the data section of a file with the name "//", this record is referred to by future headers.

        A header references an extended file name by storing a "/" followed by a decimal offset to the start of the file name in the extended file name data section.

        The format of the "//" file itself is simply a list of the long file names, each separated by one or more LF characters. Note that the decimal offsets are number of characters, not line or string number within the "//" file.

      • trackReadBytes

        private void trackReadBytes​(long read)
      • readGNUStringTable

        private ArArchiveEntry readGNUStringTable​(byte[] length,
                                                  int offset,
                                                  int len)
                                           throws java.io.IOException
        Reads the GNU archive String Table.
        Throws:
        java.io.IOException
        See Also:
        isGNUStringTable(java.lang.String)
      • isGNULongName

        private boolean isGNULongName​(java.lang.String name)
        Does the name look like it is a long name (or a name containing spaces) as encoded by SVR4/GNU ar?
        See Also:
        isGNUStringTable(java.lang.String)