Class ArArchiveInputStream

All Implemented Interfaces:
Closeable, AutoCloseable

public class ArArchiveInputStream extends ArchiveInputStream<ArArchiveEntry>
Implements the "ar" archive format as an input stream.
  • Field Details

    • NAME_OFFSET

      private static final int NAME_OFFSET
      See Also:
    • NAME_LEN

      private static final int NAME_LEN
      See Also:
    • LAST_MODIFIED_OFFSET

      private static final int LAST_MODIFIED_OFFSET
      See Also:
    • LAST_MODIFIED_LEN

      private static final int LAST_MODIFIED_LEN
      See Also:
    • USER_ID_OFFSET

      private static final int USER_ID_OFFSET
      See Also:
    • USER_ID_LEN

      private static final int USER_ID_LEN
      See Also:
    • GROUP_ID_OFFSET

      private static final int GROUP_ID_OFFSET
      See Also:
    • GROUP_ID_LEN

      private static final int GROUP_ID_LEN
      See Also:
    • FILE_MODE_OFFSET

      private static final int FILE_MODE_OFFSET
      See Also:
    • FILE_MODE_LEN

      private static final int FILE_MODE_LEN
      See Also:
    • LENGTH_OFFSET

      private static final int LENGTH_OFFSET
      See Also:
    • LENGTH_LEN

      private static final int LENGTH_LEN
      See Also:
    • BSD_LONGNAME_PREFIX

      static final String BSD_LONGNAME_PREFIX
      See Also:
    • BSD_LONGNAME_PREFIX_LEN

      private static final int BSD_LONGNAME_PREFIX_LEN
    • BSD_LONGNAME_PATTERN

      private static final Pattern BSD_LONGNAME_PATTERN
    • GNU_STRING_TABLE_NAME

      private static final String GNU_STRING_TABLE_NAME
      See Also:
    • GNU_LONGNAME_PATTERN

      private static final Pattern GNU_LONGNAME_PATTERN
    • offset

      private long offset
    • closed

      private boolean closed
    • currentEntry

      private ArArchiveEntry currentEntry
    • namebuffer

      private byte[] namebuffer
      Storage area for extra long names (GNU ar).
    • entryOffset

      private long entryOffset
      The offset where the current entry started. -1 if no entry has been called
    • metaData

      private final byte[] metaData
      Cached buffer for meta data - must only be used locally in the class (COMPRESS-172 - reduce garbage collection).
  • Constructor Details

    • ArArchiveInputStream

      public ArArchiveInputStream(InputStream inputStream)
      Constructs an Ar input stream with the referenced stream
      Parameters:
      inputStream - the ar input stream
  • Method Details

    • isBSDLongName

      private static boolean isBSDLongName(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
    • isGNUStringTable

      private static boolean isGNUStringTable(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.

    • 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
    • asInt

      private int asInt(byte[] byteArray, int offset, int len) throws IOException
      Throws:
      IOException
    • asInt

      private int asInt(byte[] byteArray, int offset, int len, boolean treatBlankAsZero) throws IOException
      Throws:
      IOException
    • asInt

      private int asInt(byte[] byteArray, int offset, int len, int base) throws IOException
      Throws:
      IOException
    • asInt

      private int asInt(byte[] byteArray, int offset, int len, int base, boolean treatBlankAsZero) throws IOException
      Throws:
      IOException
    • asLong

      private long asLong(byte[] byteArray, int offset, int len) throws IOException
      Throws:
      IOException
    • close

      public void close() throws IOException
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Overrides:
      close in class FilterInputStream
      Throws:
      IOException
    • getBSDLongName

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

      private String getExtendedName(int offset) throws IOException
      Gets 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:
      IOException - if name not found or buffer not set up
    • getNextArEntry

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

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

      private boolean isGNULongName(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:
    • read

      public int read(byte[] b, int off, int len) throws IOException
      Overrides:
      read in class FilterInputStream
      Throws:
      IOException
    • readGNUStringTable

      private ArArchiveEntry readGNUStringTable(byte[] length, int offset, int len) throws IOException
      Reads the GNU archive String Table.
      Throws:
      IOException
      See Also:
    • trackReadBytes

      private void trackReadBytes(long read)