Class ArArchiveInputStream

java.lang.Object
java.io.InputStream
org.apache.commons.compress.archivers.ArchiveInputStream
org.apache.commons.compress.archivers.ar.ArArchiveInputStream
All Implemented Interfaces:
Closeable, AutoCloseable

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

  • Constructor Details

    • ArArchiveInputStream

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

    • getNextArEntry

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

      private String getExtendedName(int offset) throws 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:
      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 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:
      IOException - if the next entry could not be read
    • close

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

      public int read(byte[] b, int off, int len) throws IOException
      Overrides:
      read in class InputStream
      Throws:
      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(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 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:
    • 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.

    • trackReadBytes

      private void trackReadBytes(long read)
    • readGNUStringTable

      private ArArchiveEntry readGNUStringTable(byte[] length, int offset, int len) throws IOException
      Reads the GNU archive String Table.
      Throws:
      IOException
      See Also:
    • 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: