Class ArArchiveInputStream
- java.lang.Object
-
- java.io.InputStream
-
- org.apache.commons.compress.archivers.ArchiveInputStream
-
- org.apache.commons.compress.archivers.ar.ArArchiveInputStream
-
- All Implemented Interfaces:
java.io.Closeable
,java.lang.AutoCloseable
public class ArArchiveInputStream extends ArchiveInputStream
Implements the "ar" archive format as an input stream.
-
-
Field Summary
Fields Modifier and Type Field Description private static java.lang.String
BSD_LONGNAME_PATTERN
(package private) static java.lang.String
BSD_LONGNAME_PREFIX
private static int
BSD_LONGNAME_PREFIX_LEN
private boolean
closed
private ArArchiveEntry
currentEntry
private long
entryOffset
private static int
FILE_MODE_LEN
private static int
FILE_MODE_OFFSET
private static java.lang.String
GNU_LONGNAME_PATTERN
private static java.lang.String
GNU_STRING_TABLE_NAME
private static int
GROUP_ID_LEN
private static int
GROUP_ID_OFFSET
private java.io.InputStream
input
private static int
LAST_MODIFIED_LEN
private static int
LAST_MODIFIED_OFFSET
private static int
LENGTH_LEN
private static int
LENGTH_OFFSET
private byte[]
metaData
private static int
NAME_LEN
private static int
NAME_OFFSET
private byte[]
namebuffer
private long
offset
private static int
USER_ID_LEN
private static int
USER_ID_OFFSET
-
Constructor Summary
Constructors Constructor Description ArArchiveInputStream(java.io.InputStream pInput)
Constructs an Ar input stream with the referenced stream
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private int
asInt(byte[] byteArray, int offset, int len)
private int
asInt(byte[] byteArray, int offset, int len, boolean treatBlankAsZero)
private int
asInt(byte[] byteArray, int offset, int len, int base)
private int
asInt(byte[] byteArray, int offset, int len, int base, boolean treatBlankAsZero)
private long
asLong(byte[] byteArray, int offset, int len)
void
close()
private java.lang.String
getBSDLongName(java.lang.String bsdLongName)
Reads the real name from the current stream assuming the very first bytes to be read are the real file name.private java.lang.String
getExtendedName(int offset)
Get an extended name from the GNU extended name buffer.ArArchiveEntry
getNextArEntry()
Returns the next AR entry in this stream.ArchiveEntry
getNextEntry()
Returns the next Archive Entry in this Stream.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?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?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?static boolean
matches(byte[] signature, int length)
Checks if the signature matches ASCII "!<arch>" followed by a single LF control characterint
read(byte[] b, int off, int len)
private ArArchiveEntry
readGNUStringTable(byte[] length, int offset, int len)
Reads the GNU archive String Table.private void
trackReadBytes(long read)
-
Methods inherited from class org.apache.commons.compress.archivers.ArchiveInputStream
canReadEntryData, count, count, getBytesRead, getCount, pushedBackBytes, read
-
-
-
-
Field Detail
-
input
private final java.io.InputStream input
-
offset
private long offset
-
closed
private boolean closed
-
currentEntry
private ArArchiveEntry currentEntry
-
namebuffer
private byte[] namebuffer
-
entryOffset
private long entryOffset
-
NAME_OFFSET
private static final int NAME_OFFSET
- See Also:
- Constant Field Values
-
NAME_LEN
private static final int NAME_LEN
- See Also:
- Constant Field Values
-
LAST_MODIFIED_OFFSET
private static final int LAST_MODIFIED_OFFSET
- See Also:
- Constant Field Values
-
LAST_MODIFIED_LEN
private static final int LAST_MODIFIED_LEN
- See Also:
- Constant Field Values
-
USER_ID_OFFSET
private static final int USER_ID_OFFSET
- See Also:
- Constant Field Values
-
USER_ID_LEN
private static final int USER_ID_LEN
- See Also:
- Constant Field Values
-
GROUP_ID_OFFSET
private static final int GROUP_ID_OFFSET
- See Also:
- Constant Field Values
-
GROUP_ID_LEN
private static final int GROUP_ID_LEN
- See Also:
- Constant Field Values
-
FILE_MODE_OFFSET
private static final int FILE_MODE_OFFSET
- See Also:
- Constant Field Values
-
FILE_MODE_LEN
private static final int FILE_MODE_LEN
- See Also:
- Constant Field Values
-
LENGTH_OFFSET
private static final int LENGTH_OFFSET
- See Also:
- Constant Field Values
-
LENGTH_LEN
private static final int LENGTH_LEN
- See Also:
- Constant Field Values
-
metaData
private final byte[] metaData
-
BSD_LONGNAME_PREFIX
static final java.lang.String BSD_LONGNAME_PREFIX
- See Also:
- Constant Field Values
-
BSD_LONGNAME_PREFIX_LEN
private static final int BSD_LONGNAME_PREFIX_LEN
-
BSD_LONGNAME_PATTERN
private static final java.lang.String BSD_LONGNAME_PATTERN
- See Also:
- Constant Field Values
-
GNU_STRING_TABLE_NAME
private static final java.lang.String GNU_STRING_TABLE_NAME
- See Also:
- Constant Field Values
-
GNU_LONGNAME_PATTERN
private static final java.lang.String GNU_LONGNAME_PATTERN
- See Also:
- Constant Field Values
-
-
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 classArchiveInputStream
- 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 interfacejava.lang.AutoCloseable
- Specified by:
close
in interfacejava.io.Closeable
- Overrides:
close
in classjava.io.InputStream
- Throws:
java.io.IOException
-
read
public int read(byte[] b, int off, int len) throws java.io.IOException
- Overrides:
read
in classjava.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 checklength
- 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)
-
-