Package Description
org.apache.commons.compress
org.apache.commons.compress.archivers 提供统一的 API 和工厂,用于处理不同格式的归档文件
org.apache.commons.compress.archivers.ar 提供用于读取写入 AR 格式归档的流类
org.apache.commons.compress.archivers.arj 提供用于读取 ARJ 格式归档的流类
org.apache.commons.compress.archivers.cpio 提供用于读取写入 CPIO 格式归档的流类
org.apache.commons.compress.archivers.dump 提供用于读取 Unix DUMP 格式归档的流类
org.apache.commons.compress.archivers.examples 示例代码,但是不能保证跨版本提供稳定的API
org.apache.commons.compress.archivers.jar 提供用于读取写入 ZIP 格式归档文件的流类,并为 JAR 归档文件的特殊情况提供一些扩展。
org.apache.commons.compress.archivers.sevenz 提供用于读取写入7Z格式存档的流类
org.apache.commons.compress.archivers.tar 提供用于读取写入TAR格式存档的流类
org.apache.commons.compress.archivers.zip 提供用于读取写入ZIP格式存档的流类
org.apache.commons.compress.changes 对应用于归档的变更集的实验性支持。
org.apache.commons.compress.compressors 为处理压缩流提供统一的API和工厂。
org.apache.commons.compress.compressors.brotli 提供用于基于Google Brotli 解码器的 Brotli 算法解压流的流类。
org.apache.commons.compress.compressors.bzip2 提供用于压缩和解压缩使用 BZip2 算法的流的流类
org.apache.commons.compress.compressors.deflate 提供用于允许压缩和解压缩使用 DEFLATE 算法的流的流类
org.apache.commons.compress.compressors.deflate64 提供用于允许压缩和解压缩使用 DEFLATE64 算法的流的流类
org.apache.commons.compress.compressors.gzip 提供用于压缩和解压缩使用 GZip 算法的流的流类
org.apache.commons.compress.compressors.lz4 LZ4 算法提供流类
org.apache.commons.compress.compressors.lz77support 为 LZ77 基础算法提供工具类
org.apache.commons.compress.compressors.lzma 为使用独立的 LZMA 算法提供流类
org.apache.commons.compress.compressors.lzw 通用的 LZW 实现
org.apache.commons.compress.compressors.pack200 提供用于压缩解压缩使用了 Pack200 算法去压缩 Java 归档文件的流类
org.apache.commons.compress.compressors.snappy Snappy 算法提供流类.
org.apache.commons.compress.compressors.xz 提供用于压缩和解压缩使用 XZ 算法的流的流类
org.apache.commons.compress.compressors.z Provides stream classes for decompressing streams using the “compress” algorithm used to write .Z files.
提供用于解压使用 “compress” 算法去写入 .Z 文件的 流类
org.apache.commons.compress.compressors.zstandard Provides stream class for (de)compressing streams using the Zstandard algorithm based on Zstandard JNI.
提供用于压缩和解压缩使用基于 Zstandard JNI 的 Zstandard 算法的流的流类
org.apache.commons.compress.harmony.archive.internal.nls
org.apache.commons.compress.harmony.pack200
org.apache.commons.compress.harmony.unpack200
org.apache.commons.compress.harmony.unpack200.bytecode
org.apache.commons.compress.harmony.unpack200.bytecode.forms
org.apache.commons.compress.java.util.jar
org.apache.commons.compress.parallel 为并行压缩功能提供公共API类
org.apache.commons.compress.utils 包含压缩库内部使用的工具类

org.apache.commons.compress

ArchiveEntry

表示存档中的一个条目

Modifier and Type Method and Description
Date getLastModifiedDate()
获取该条目的最后一次修改时间
String getName()
获取在归档中的该条目的名称
long getSize()
获取该条目解压后的大小,如果大小位置则返回-1
boolean isDirectory()
如果该条目表示一个目录则返回true

ArchiveStreamProvider

创建归档 ArchiveInputStreams 和 ArchiveOutputStreams。

Modifier and Type Method and Description
ArchiveInputStream createArchiveInputStream(String name, InputStream in, String encoding)
通过归档名称和输入流创建一个归档输入流
ArchiveOutputStream createArchiveOutputStream(String name, OutputStream out, String encoding)
通过归档名称和输出流创建一个归档输出流
Set[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true) getInputStreamArchiveNames()
获取此 provider 的所有输入流存档名称
Set[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true) getOutputStreamArchiveNames()
获取此 provider 的所有输出流存档名称

createArchiveInputStream

ArchiveInputStream createArchiveInputStream(String name, InputStream in, String encoding) throws ArchiveException
通过归档名称和输入流创建一个归档输入流

Parameters:
name - 归档名称,例如 ar, arj,zip,tar,jar,cpio,dump,7z
in - 输入流
enconding - 编码名称,默认为 null

createArchiveOutputStream

ArchiveOutputStream createArchiveOutputStream(String name, OutputStream out, String encoding) throws ArchiveException

通过归档名称和输出流创建一个归档输出流

Parameters:
name - 归档名称,例如 ar,zip,tar,jar,cpio
out - 输出流
enconding - 编码名称,默认为 null

EntryStreamOffsets

提供关于 ArchiveEntry 流偏移量的信息

Modifier and Type Method and Description
long getDataOffset()
获取该数据流在归档文件中的偏移量
boolean isStreamContiguous()
指示该流是否连续

ArchiveInputStream

ArchiveInputStream 必须重写 InputStream.read(byte[], int, int) 或者 read() 方法,以便从流中读取每个条目中的数据末尾以及文件末尾生成的 EOF 。

getNextEntry()用于重置输入流,以便从下一个条目中读取数据。

输入流类还必须实现一个带有签名的方法:

public static boolean matches(byte[] signature, int length)

ArchiveStreamFactory 使用它从流的前几个字节中自动检测归档类型。

Modifier and Type Method and Description
boolean canReadEntryData(ArchiveEntry archiveEntry)
此流是否能够读取给定条目
protected void count(int read)
增加已读取字节的计数器
protected void count(long read)
增加已读取字节的计数器。
long getBytesRead()
从当前流中返回已读取字节数量
int getCount()
Deprecated.
对于大的归档文件,此方法可能会产生错误的结果,请改用 #getBytesRead
abstract ArchiveEntry getNextEntry()
返回流中的下一个条目
protected void pushedBackBytes(long pushedBack)
减少已读取字节的计数器
int read()
读取一个字节的数据。该方法将阻塞知道该输入流可用。

ArchiveOutputStream

ArchiveOutputStream 需要重写 OutputStream.write(byte[], int, int) 以提升性能。还应该重写 OutputStream.close()。使用 ArchiveOutputStreams 时的正常调用顺序是:

  1. 创建 ArchiveOutputStream 对象
  2. 可选择写入 SFX 标头(仅限 Zip)
  3. 根据需要重复:
    1. putArchiveEntry(ArchiveEntry) (写入条目标题)
    2. OutputStream.write(byte[]) (写入条目数据)
    3. closeArchiveEntry() (关闭条目)
  4. finish() (结束添加条目)
  5. 可选地写入附加数据,只要格式支持此操作
Modifier and Type Method and Description
boolean canWriteEntryData(ArchiveEntry archiveEntry)
此流是否能够写入给定条目
abstract void closeArchiveEntry()
关闭存档条目,写入可能需要的任何预告片信息
protected void count(int written)
增加已写入字节的计数器
protected void count(long written)
增加已写入字节的计数器
abstract ArchiveEntry createArchiveEntry(File inputFile, String entryName)
使用提供的 inputFile 和 entryName 创建存档条目
ArchiveEntry createArchiveEntry(Path inputPath, String entryName, LinkOption… options)
使用提供的 inputPath 和 entryName 创建存档条目
abstract void finish()
完成向该流添加条目,但是不关闭它。如果格式支持,可以写入其他数据
long getBytesWritten()
从当前流中返回已写入字节数量
int getCount()
Deprecated.
对于大的归档文件,此方法可能会产生错误的结果,请改用 #getBytesWritten
abstract void putArchiveEntry(ArchiveEntry entry)
将归档条目的头部写入输出流。然后调用者必须将内容写入流并调用 closeArchiveEntry() 以完成该过程
void write(int b)
将一个字节写入当前存档条目

ArchiveStreamFactory

通过名称或 InputStream 的第一个字节创建 Archive[In|Out]putStreams 的工厂类。如果需要别的实现类,需要继承 ArchiveStreamFactory 并重写适当的方法(当然还要从 super 调用它们的实现)。

压缩 ZIP 文件:

  1. // 打开或创建文件,返回一个用于向文件写入bytes的输入流
  2. final OutputStream out = Files.newOutputStream(output.toPath());
  3. ArchiveOutputStream os = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, out);
  4. os.putArchiveEntry(new ZipArchiveEntry("testdata/test1.xml"));
  5. IOUtils.copy(Files.newInputStream(file1.toPath()), os);
  6. os.closeArchiveEntry();
  7. os.putArchiveEntry(new ZipArchiveEntry("testdata/test2.xml"));
  8. IOUtils.copy(Files.newInputStream(file2.toPath()), os);
  9. os.closeArchiveEntry();
  10. os.close();

解压缩 ZIP 文件:

  1. // 打开一个文件,返回一个输出流用来读取文件
  2. final InputStream is = Files.newInputStream(input.toPath());
  3. ArchiveInputStream in = new ArchiveStreamFactory().createArchiveInputStream(ArchiveStreamFactory.ZIP, is);
  4. ZipArchiveEntry entry = (ZipArchiveEntry)in.getNextEntry();
  5. OutputStream out = Files.newOutputStream(dir.toPath().resolve(entry.getName()));
  6. IOUtils.copy(in, out);
  7. out.close();
  8. in.close();

该类是不可变的,前提是不使用已废弃的方法 ~~setEntryEncoding~~
这个类是线程安全的,即使使用了已弃用的方法~~setEntryEncoding~~

Fields

Modifier and Type Field and Description
static String AR
ar 常量,用来定义 AR 归档格式
static String ARJ
arj 常量,用来定义 ARJ 归档格式
static String CPIO
cpio 常量,用来定义 CPIO 归档格式
static ArchiveStreamFactory DEFAULT
The singleton instance using the platform default encoding.
static String DUMP
dump 常量,用来定义 DUMP 归档格式
static String JAR
jar 常量,用来定义 JAR 归档格式
static String SEVEN_Z
7z 常量,用来定义 7z 归档格式
static String TAR
tar 常量,用来定义 TAR 归档格式
static String ZIP
zip 常量,用来定义 ZIP 归档格式

Methods

Modifier and Type Method and Description
ArchiveInputStream createArchiveInputStream(InputStream in)
从一个输入流创建一个归档输入流。根据输入流头部少量字节自动检测归档类型
ArchiveInputStream createArchiveInputStream(String archiverName,InputStream in)
根据归档名称和给定的输入流创建一个归档输入流
ArchiveInputStream createArchiveInputStream(String archiverName, InputStream in, String actualEncoding)
根据归档名称和给定的输入流创建一个归档输入流
ArchiveOutputStream createArchiveOutputStream(String archiverName, OutputStream out)
根据归档名称和给定的输出流创建一个归档输出流
ArchiveOutputStream createArchiveOutputStream(String archiverName, OutputStream out, String actualEncoding)
根据归档名称和给定的输出流创建一个归档输出流
static String detect(InputStream in)
尝试获取归档的类型
static SortedMap[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true),[ArchiveStreamProvider](https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/archivers/ArchiveStreamProvider.html) findAvailableArchiveInputStreamProviders()
从输入流提供者名称到提供者对象构造一个新的排序Map
static SortedMap[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true),[ArchiveStreamProvider](https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/archivers/ArchiveStreamProvider.html) findAvailableArchiveOutputStreamProviders()
从输出流提供者名称到提供者对象构造一个新的排序Map
SortedMap[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true),[ArchiveStreamProvider](https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/archivers/ArchiveStreamProvider.html) getArchiveInputStreamProviders()
SortedMap[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true),[ArchiveStreamProvider](https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/archivers/ArchiveStreamProvider.html) getArchiveOutputStreamProviders()
String getEntryEncoding()
返回用于 arj、jar、zip、dump、cpio 和 tar 文件的编码,或者为归档程序默认值返回 null
Set[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true) getInputStreamArchiveNames()
获取此 provider 的所有输入流归档名称
Set[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true) getOutputStreamArchiveNames()
获取此 provider 的所有输出流归档名称
void setEntryEncoding(String entryEncoding)
Deprecated.
1.10 use ArchiveStreamFactory(String) to specify the encoding

createArchiveInputStream

public ArchiveInputStream createArchiveInputStream(String archiverName, InputStream in) throws ArchiveException

根据归档名称和给定的输入流创建一个归档输入流

Parameters:
archiverName - the archive name, i.e. “ar”, “arj”, “zip”, “tar”, “jar”, “cpio”, “dump” or “7z”
in - the input stream

createArchiveOutputStream

public ArchiveOutputStream createArchiveOutputStream(String archiverName, OutputStream out) throws ArchiveException

根据归档名称和给定的输出流创建一个归档输出流

Parameters:
archiverName - the archive name, i.e. “ar”, “zip”, “tar”, “jar” or “cpio”
out - the output stream

Lister

列出归档文件内容的简单命令行应用程序。

归档的名称必须作为命令行参数给出。

可选的第二个参数定义归档类型,以防格式无法识别。

org.apache.commons.compress.archivers.zip

CharsetAccessor

添加一个接口以允许访问与 NioZipEncoding 关联的字符集,而无需将新方法添加到 ZipEncoding。

这避免了引入潜在的破坏性更改,或使 NioZipEncoding 成为公共类。

Modifier and Type Method and Description
Charset getCharset()
提供对与对象关联的字符集的访问。这允许面向 nio 的代码使用更自然的字符编码/解码方法,同时允许现有代码继续依赖 UTF-8 的特殊情况错误处理

ExtraFieldParsingBehavior

解析 zip 额外字段的控制细节

Modifier and Type Method and Description
ZipExtraField createExtraField(ZipShort headerId)
通过给定的 id 创建一个 ZipExtraField 实例。 ExtraFieldUtils.createExtraField(org.apache.commons.compress.archivers.zip.ZipShort)就是一个很好的默认实现
ZipExtraField fill(ZipExtraField field, byte[] data, int off, int len, boolean local)
填写单个额外字段的额外字段数据

fill

ZipExtraField fill(ZipExtraField field, byte[] data, int off, int len, boolean local) throws ZipException

填写单个额外字段的额外字段数据

ExtraFieldUtils.fillExtraField(org.apache.commons.compress.archivers.zip.ZipExtraField, byte[], int, int, boolean) 是一个很好的默认实现。

Parameters:
field - 需要取填充的额外字段
data - 额外字段数据数组
off - 距离开始位置的偏移量
len - 字段数据的长度
local - 额外的字段数据是否来自本地文件头。 如果为 false,那么数据是中央目录标题额外数据的一部分

return:
填充的字段。 通常这与字段相同,但它也可以是替换的额外字段。 不得为空。

UnixStat

Unix 系统的 stat.h 文件中的常量

Modifier and Type Field and Description
static int DEFAULT_DIR_PERM
目录的默认权限
static int DEFAULT_FILE_PERM
明文文件的默认权限
static int DEFAULT_LINK_PERM
符号链接的默认权限。
static int DIR_FLAG
目录标识
static int FILE_FLAG
明文文件标识
static int FILE_TYPE_FLAG
Bits,用来指示文件系统对象类型
static int LINK_FLAG
指示符号链接
static int PERM_MASK
Bits,用于权限(和粘性位)

UnparseableExtraFieldBehavior

处理不遵循带有两字节 key 和两字节长度的额外字段的推荐模式的额外字段数据。

Modifier and Type Method and Description
ZipExtraField onUnparseableExtraField(byte[] data, int off, int len, boolean local, int claimedLength)
决定如何处理不遵循推荐模式的额外字段数据

onUnparseableExtraField

ZipExtraField onUnparseableExtraField(byte[] data, int off, int len, boolean local, int claimedLength) throws ZipException

决定如何处理不遵循推荐模式的额外字段数据

Parameters:
data - 额外字段数据的数组
off - 偏移到不可解析数据开始的数据中
len - 不可解析数据的长度
local - 额外字段数据是否来自本地文件头。 如果为 false,那么数据是中央目录标题额外数据的一部分
claimLength - 第三个和第四个字节声明的额外字段的长度,如果它确实遵循推荐的模式

Return:
如果应忽略数据或额外字段实现表示了该数据,则为 null

ZipArchiveEntryPredicate

用于测试 #ZipArchiveEntry 是否与条件匹配的谓词。 可能支持继承 java.util.function.Predicate

Modifier and Type Method and Description
boolean test(ZipArchiveEntry zipArchiveEntry)
指示给定条目是否应包含在操作中

ZipArchiveEntryRequestSupplier

提供 ZipArchiveEntryRequest。实现类需要支持线程切换。 虽然一个实例不会被多个线程同时访问,但它将由与创建它的线程不同的线程调用。

Modifier and Type Method and Description
ZipArchiveEntryRequest get()
提供要添加到并行归档中的 ZipArchiveEntryRequest

ZipEncoding

对 ZIP 文件名进行优雅编码的编码器接口。主要有两种实现,一种使用 java.nio 字符集,另一种处理简单的 8 位字符集,因为 java-1.4 在 java.nio 中不支持 Cp437。

定义自己的编码层的主要原因来自 String.getBytes 的问题,它将未知字符编码为 ASCII 引号 (‘?’)。 引号在某些操作系统(如 Windows)上根据定义是无效的文件名,这会导致 ZIP 条目被忽略。

所有的实现类都应该以可重入的方式实现这个接口。

Modifier and Type Method and Description
boolean canEncode(String name)
检查给定的字符串是否可以使用此编码进行无损编码
String decode(byte[] data)
ByteBuffer encode(String name)
将文件名或注释编码为适合将其存储到序列化 zip 条目的字节数组

encode

ByteBuffer encode(String name) throws IOException

将文件名或注释编码为适合将其存储到序列化 zip 条目的字节数组。CP437 的示例(在伪符号中,右侧是 C 样式符号):

  1. encode("?_for_Dollar.txt") = "%U20AC_for_Dollar.txt"
  2. encode("Ölfässer.txt") = "\231lf\204sser.txt"

Parameters:
name - 文件名或 ZIP 注释。

Return:
带有包含编码名称的后备数组的字节缓冲区。 无法映射的字符或格式错误的字符序列被映射到以 %Uxxxx 格式编码的 utf-16 字序列。 假设字节缓冲区位于编码结果的开头,字节缓冲区有一个后备数组,字节缓冲区的限制指向编码结果的末尾。

ZipExtraField

额外字段数据的通用格式

额外字段通常在每个文件中出现两次,一次在本地文件数据中,一次在中央目录中。 通常它们是相同的,但它们不必相同。 java.util.zip.ZipOutputStream 只会在两个地方使用本地文件数据。

Fields

Modifier and Type Field and Description
static int EXTRAFIELD_HEADER_SIZE
额外字段在字段头部大小(id + length)

Methods

Modifier and Type Method and Description
byte[] getCentralDirectoryData()
放入中央目录的实际数据 - 没有 Header-ID 或长度说明符
ZipShort getCentralDirectoryLength()
中央目录中额外字段的长度 - 没有 Header-ID 或长度说明符
ZipShort getHeaderId()
The Header-ID.
byte[] getLocalFileDataData()
放入本地文件的实际数据 - 没有 Header-ID 或长度说明符
ZipShort getLocalFileDataLength()
本地文件数据中额外字段的长度 - 没有 Header-ID 或长度说明符
void parseFromCentralDirectoryData(byte[] buffer, int offset, int length)
从此数组中填充数据,就好像它在中央目录数据中一样
void parseFromLocalFileData(byte[] buffer, int offset, int length)
从此数组中填充数据,就好像它在本地文件数据中一样

AbstractUnicodeExtraField

ZipExtraField的直接子类。Unicode 额外信息额外字段的通用基类。

Modifier and Type Method and Description
byte[] getCentralDirectoryData()
放入中央目录的实际数据 - 没有 Header-ID 或长度说明符
ZipShort getCentralDirectoryLength()
中央目录中额外字段的长度 - 没有 Header-ID 或长度说明符
byte[] getLocalFileDataData()
放入本地文件的实际数据 - 没有 Header-ID 或长度说明符
ZipShort getLocalFileDataLength()
本地文件数据中额外字段的长度 - 没有 Header-ID 或长度说明符
long getNameCRC32()
byte[] getUnicodeName()
void parseFromCentralDirectoryData(byte[] buffer, int offset, int length)
没有做任何特别的事情,因为这个类总是在中央目录和本地文件数据中使用相同的数据
void parseFromLocalFileData(byte[] buffer, int offset, int length)
从此数组中填充数据,就好像它在本地文件数据中一样
void setNameCRC32
(long nameCRC32)
void setUnicodeName
(byte[] unicodeName)

AsiExtraField

  1. public class AsiExtraField extends Object
  2. implements ZipExtraField, UnixStat, Cloneable

添加 Unix 文件权限和 UID/GID 字段以及符号链接处理。

此类使用以下格式的 ASi 额外字段:

  1. Value Size Description
  2. ----- ---- -----------
  3. (Unix3) 0x756e Short tag for this extra block type
  4. TSize Short total data size for this block
  5. CRC Long CRC-32 of the remaining data
  6. Mode Short file permissions
  7. SizDev Long symlink'd size OR major/minor dev num
  8. UID Short user ID
  9. GID Short group ID
  10. (var.) variable symbolic link file name

取自 ftp://ftp.uu.net/pub/archiving/zip/doc/ 上的 appnote.iz (Info-ZIP note, 981119)

Short 是两个字节,Long 是大端字节序的四个字节,目前不支持设备号。

这个类不是线程安全的。由于该类所基于的文档根本没有提及文件名的字符编码,因此假定它使用当前平台的默认编码。

Modifier and Type Method and Description
Object clone()
byte[] getCentralDirectoryData()
委托给本地文件数据
ZipShort getCentralDirectoryLength()
委托给本地文件数据
int getGroupId()
ZipShort getHeaderId()
String getLinkedFile()
链接文件名称
byte[] getLocalFileDataData()
The actual data to put into local file data - without Header-ID or length specifier.
ZipShort getLocalFileDataLength()
Length of the extra field in the local file data - without Header-ID or length specifier.
int getMode()
protected int getMode(int mode)
使用正确的文件类型获取给定权限的文件模式
int getUserId()
boolean isDirectory()
boolean isLink()
void parseFromCentralDirectoryData(byte[] buffer, int offset, int length)
没有做任何特别的事情,因为这个类总是在中央目录和本地文件数据中使用相同的数据
void parseFromLocalFileData(byte[] data, int offset, int length)
Populate data from this array as if it was in local file data.
void setDirectory(boolean dirFlag)
void setGroupId(int gid)
void setLinkedFile(String name)
void setMode(int mode)
void setUserId(int uid)

ExtraFieldUtils

ZipExtraField 相关方法

Modifier and Type Method and Description
static ZipExtraField createExtraField(ZipShort headerId)
创建适当的 ExtraField 的实例,回退到 UnrecognizedExtraField
static ZipExtraField createExtraFieldNoDefault(ZipShort headerId)
创建适当的 ExtraField 的实例
static ZipExtraField fillExtraField(ZipExtraField ze, byte[] data, int off, int len, boolean local)
将额外的字段数据填充到给定的实例中
static byte[] mergeCentralDirectoryData(ZipExtraField[] data)
合并给定 ZipExtraFields 的中心目录字段
static byte[] mergeLocalFileDataData(ZipExtraField[] data)
合并给定 ZipExtraFields 的本地文件字段
static ZipExtraField[] parse(byte[] data)
将数组拆分为 ExtraFields 并将给定数据填充为本地文件数据,如果无法解析数据则抛出异常
static ZipExtraField[] parse(byte[] data, boolean local)
将数组拆分为 ExtraFields 并用给定的数据填充它们,如果无法解析数据则抛出异常
static ZipExtraField[] parse(byte[] data, boolean local, ExtraFieldParsingBehavior parsingBehavior)
将数组拆分为 ExtraFields 并用给定的数据填充它们
static ZipExtraField[] parse(byte[] data, boolean local, ExtraFieldUtils.UnparseableExtraField onUnparseableData)
将数组拆分为 ExtraFields 并用给定的数据填充它们
static void register(Class<?> c)
注册 ZipExtraField 实现类

GeneralPurposeBit

ZIP 本地文件和中央目录头中“通用位”字段的解析器/编码器

Modifier and Type Method and Description
Object clone()
byte[] encode()
以适合 ZIP 归档的形式对设置的位进行编码
void encode(byte[] buf, int offset)
以适合 ZIP 归档的形式对设置的位进行编码。
boolean equals(Object o)
int hashCode()
static GeneralPurposeBit parse(byte[] data, int offset)
从给定的归档数据中解析支持的 flags
void useDataDescriptor(boolean b)
当前条目是否会使用数据描述符来存储 CRC 和大小信息
void useEncryption(boolean b)
当前条目是否会被加密
boolean usesDataDescriptor()
当前条目是否会使用数据描述符来存储 CRC 和大小信息。
boolean usesEncryption()
当前条目是否会被加密
boolean usesStrongEncryption()
当前条目是否使用强加密进行加密
void useStrongEncryption(boolean b)
当前条目是否使用强加密进行加密
boolean usesUTF8ForNames()
当前条目是否使用 UTF8 作为文件名和注释
void useUTF8ForNames(boolean b)
当前条目是否使用 UTF8 作为文件名和注释

JarMarker

  1. public final class JarMarker extends Object
  2. implements ZipExtraField

如果将此额外字段添加为归档的第一个额外字段,则 Solaris 会将其视为可执行 jar 文件。

Modifier and Type Method and Description
byte[] getCentralDirectoryData()
ZipShort getCentralDirectoryLength()
ZipShort getHeaderId()
static JarMarker getInstance()
由于 JarMarker 是无状态的,我们总是可以使用相同的实例
byte[] getLocalFileDataData()
ZipShort getLocalFileDataLength()
void parseFromCentralDirectoryData(byte[] buffer, int offset, int length)
void parseFromLocalFileData(byte[] data, int offset, int length)

ParallelScatterZipCreator

通过使用多个 ThreadLocal ScatterZipOutputStream 实例并行创建一个 zip。

请注意,在 1.18 之前,此类通常不保证写入输出文件的内容的顺序。 需要按特定顺序(清单、目录)出现的事情必须由此类的客户端处理,通常是在调用此类上的 writeTo 之前将这些事情写入 ZipArchiveOutputStream。

客户端可以提供一个 ExecutorService,但出于内存模型一致性的原因,这将在完成之前被此类关闭。

Modifier and Type Method and Description
void addArchiveEntry(ZipArchiveEntry zipArchiveEntry, InputStreamSupplier source)
添加一个归档条目当该归档
void addArchiveEntry(ZipArchiveEntryRequestSupplie zipArchiveEntryRequestSupplier)
添加一个归档条目当该归档
Callable[ScatterZipOutputStream](https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.html) createCallable(ZipArchiveEntry zipArchiveEntry, InputStreamSupplier source)
创建一个用来压缩给定归档条目的 Callable
Callable[ScatterZipOutputStream](https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.html) createCallable(ZipArchiveEntryRequestSupplier zipArchiveEntryRequestSupplier)
创建一个用来压缩 ZipArchiveEntryRequestSupplier 提供的归档条目的 Callable
ScatterStatistics getStatisticsMessage()
返回一条消息,描述压缩运行的总体统计信息
void submit(Callable<? extends Object> callable)
提交一个用来压缩的Callable
void submitStreamAwareCallable(Callable<? extends ScatterZipOutputStream> callable)
提交一个用来压缩的Callable
void writeTo(ZipArchiveOutputStream targetStream)
将内容写入目标 ZipArchiveOutputStream

PKWareExtraHeader

  1. public abstract class PKWareExtraHeader extends Object
  2. implements ZipExtraField

所有 PKWare 强加密额外头部的基类。这个基类充当一个标记,因此如果您对 PKWare 强加密的元数据不感兴趣,您可以忽略所有扩展该类的额外字段。

算法 ID - 来自以下范围的加密算法的整数标识符:

  • 0x6601 - DES
  • 0x6602 - RC2 (version needed to extract < 5.2)
  • 0x6603 - 3DES 168
  • 0x6609 - 3DES 112
  • 0x660E - AES 128
  • 0x660F - AES 192
  • 0x6610 - AES 256
  • 0x6702 - RC2 (version needed to extract >= 5.2)
  • 0x6720 - Blowfish
  • 0x6721 - Twofish
  • 0x6801 - RC4
  • 0xFFFF - Unknown algorithm

哈希算法 - 哈希算法的整数标识符,来自以下范围:

  • 0x0000 - none
  • 0x0001 - CRC32
  • 0x8003 - MD5
  • 0x8004 - SHA1
  • 0x8007 - RIPEMD160
  • 0x800C - SHA256
  • 0x800D - SHA384
  • 0x800E - SHA512
Modifier and Type Method and Description
protected void assertMinimalLength(int minimum, int length)
byte[] getCentralDirectoryData()
ZipShort getCentralDirectoryLength()
ZipShort getHeaderId()
byte[] getLocalFileDataData()
ZipShort getLocalFileDataLength()
void parseFromCentralDirectoryData(byte[] data, int offset, int length)
void parseFromLocalFileData(byte[] data, int offset, int length)
void setCentralDirectoryData(byte[] data)
void setLocalFileDataData(byte[] data)

ResourceAlignmentExtraField

  1. public abstract class PKWareExtraHeader extends Object
  2. implements ZipExtraField

一个额外的字段,其唯一目的是对齐和填充本地文件头,以便条目的数据从某个位置开始。

读取填充字段时,填充的填充内容将被忽略且不保留。

这使 Commons Compress 能够创建类似于 Android 的 zipalign 命令行工具的“对齐”归档。

Modifier and Type Method and Description
boolean allowMethodChange()
指示重新压缩 zip 文件时是否允许更改方法
short getAlignment()
获取请求的对齐方式
byte[] getCentralDirectoryData()
ZipShort getCentralDirectoryLength()
ZipShort getHeaderId()
byte[] getLocalFileDataData()
ZipShort getLocalFileDataLength()
void parseFromCentralDirectoryData(byte[] buffer, int offset, int length)
void parseFromLocalFileData(byte[] buffer, int offset, int length)

ScatterStatistics

提供有关分散压缩运行的信息。

Modifier and Type Method and Description
long getCompressionElapsed()
并行压缩阶段经过的毫秒数
long getMergingElapsed()
合并并行压缩的结果经过的毫秒数,IO阶段

ScatterZipOutputStream

一个 zip 输出流,针对 zip 文件的多线程分散/聚集构造进行了优化。此类使用的条目的内部数据格式对此类完全私有,并且不属于任何公共 api。

可以继承此类以支持不同类型的后备存储,默认实现仅支持基于文件的后备。

线程安全:这个类支持多线程。 但是“writeTo”方法必须由最初创建 ZipArchiveEntry 的线程调用。

Modifier and Type Method and Description
void addArchiveEntry(ZipArchiveEntryRequest zipArchiveEntryRequest)
将存档条目添加到此分散流
void close()
static ScatterZipOutputStream fileBased(File file)
使用文件支持的默认压缩级别创建 ScatterZipOutputStream
static ScatterZipOutputStream fileBased(File file, int compressionLevel)
创建由文件支持的 ScatterZipOutputStream
void writeTo(ZipArchiveOutputStream target)
将此分散流的内容写入目标归档
ScatterZipOutputStream.ZipEntryWriter zipEntryWriter()
获取此分散流的 zip 条目编写器

StreamCompressor

封装了 Deflater 和 crc 计算器,处理多种类型的输出流。 目前 ZipEntry.DEFLATED 和 ZipEntry.STORED 是唯一支持的压缩方法。

Modifier and Type Method and Description
void close()
static StreamCompressor create(int compressionLevel, ScatterGatherBackingStore bs)
通过给定的压缩级别创建一个流压缩器
static StreamCompressor create(ScatterGatherBackingStore bs)
通过给定的压缩级别创建一个流压缩器
void deflate(InputStream source, int method)
使用提供的压缩方法对给定的源进行解压
long getBytesRead()
获取从源流中读取的字节数量
long getBytesWrittenForLastEntry()
写入到最后一个条目的输出流的字节数
long getCrc32()
最后一个解压条目的 crc32
long getTotalBytesWritten()
写入到最后一个条目的输出流的字节数
所有文件写入输出流的总字节数
void writeCounted(byte[] data)
void writeCounted(byte[] data, int offset, int length)
protected abstract void writeOut(byte[] data, int offset, int length)

UnicodeCommentExtraField

  1. public class UnicodeCommentExtraField extends AbstractUnicodeExtraField

Info-ZIP Unicode 注释额外字段 (0x6375):存储中央目录头部中存储的文件注释的 UTF-8 版本。

非线程安全类,父类也是非线程安全类。

UnicodePathExtraField

  1. public class UnicodePathExtraField
  2. extends AbstractUnicodeExtraField

Info-ZIP Unicode 路径额外字段 (0x6375):存储本地文件头部和中央目录头部中存储的文件名称字段的 UTF-8 版本。

非线程安全类,父类也是非线程安全类。

UnparseableExtraFieldData

  1. public final class UnparseableExtraFieldData extends Object
  2. implements ZipExtraField

不符合推荐的 header-tag + size + data 格式的额外字段数据的包装器。

header-id 是人为的(在 APPNOTE.TXT 中未列为已知 ID)。 由于除了满足 ZipExtraField 约束外,它不会在任何地方使用,因此无论如何都无关紧要。

Modifier and Type Method and Description
byte[] getCentralDirectoryData()
要放入中央目录的实际数据
ZipShort getCentralDirectoryLength()
中央目录中完整额外字段的长度
ZipShort getHeaderId()
The Header-ID.
byte[] getLocalFileDataData()
要放入本地文件数据的实际数据
ZipShort getLocalFileDataLength()
本地文件数据中完整额外字段的长度
void parseFromCentralDirectoryData(byte[] buffer, int offset, int length)
从此数组中填充数据,就好像它在中央目录数据中一样
void parseFromLocalFileData(byte[] buffer, int offset, int length)
从此数组中填充数据,就好像它在本地文件数据中一样

X000A_NTFS

  1. public class X000A_NTFS extends Object
  2. implements ZipExtraField

NTFS 额外字段被认为存储各种属性,但实际上只存储时间戳。

  1. 4.5.5 -NTFS Extra Field (0x000a):
  2. 下面是NTFS属性 extra 块的布局。(注:此时MtimeAtime
  3. Ctime 值可以在任何 WIN32 系统上使用。)
  4. Note: all fields stored in Intel low-byte/high-byte order.
  5. 注意:所有字段以 Intel 低字节/高字节顺序存储
  6. Value Size Description
  7. ----- ---- -----------
  8. (NTFS) 0x000a 2 bytes Tag for this "extra" block type
  9. TSize 2 bytes Size of the total "extra" block
  10. Reserved 4 bytes Reserved for future use
  11. Tag1 2 bytes NTFS attribute tag value #1
  12. Size1 2 bytes Size of attribute #1, in bytes
  13. (var) Size1 Attribute #1 data
  14. .
  15. .
  16. .
  17. TagN 2 bytes NTFS attribute tag value #N
  18. SizeN 2 bytes Size of attribute #N, in bytes
  19. (var) SizeN Attribute #N data
  20. 对于 NTFSTag1 TagN 的值如下:
  21. (目前只为 NTFS 定义了一组属性)
  22. Tag Size Description
  23. ----- ---- -----------
  24. 0x0001 2 bytes Tag for attribute #1
  25. Size1 2 bytes Size of attribute #1, in bytes
  26. Mtime 8 bytes File last modification time
  27. Atime 8 bytes File last access time
  28. Ctime 8 bytes File creation time
Modifier and Type Method and Description
boolean equals(Object o)
Date getAccessJavaTime()
以该 zip 条目的 java.util.Date 形式返回访问时间,如果 zip 条目中不存在此类时间戳,则返回 null
ZipEightByteInteger getAccessTime()
返回此 zip 条目的“文件上次访问时间”作为 ZipEightByteInteger 对象,如果 zip 条目中不存在此类时间戳,则返回 ZipEightByteInteger.ZERO
byte[] getCentralDirectoryData()
ZipShort getCentralDirectoryLength()
Date getCreateJavaTime()
以 java.util.Date 形式返回此 zip 条目的创建时间,如果 zip 条目中不存在此类时间戳,则返回 null
ZipEightByteInteger getCreateTime()
返回此 zip 条目的“文件创建时间”作为 ZipEightByteInteger 对象,如果 zip 条目中不存在此类时间戳,则返回 ZipEightByteInteger.ZERO
ZipShort getHeaderId()
byte[] getLocalFileDataData()
ZipShort getLocalFileDataLength()
Date getModifyJavaTime()
以此 zip 条目的 java.util.Date 形式返回修改时间,如果 zip 条目中不存在此类时间戳,则返回 null
ZipEightByteInteger getModifyTime()
返回此 zip 条目的“文件上次修改时间”作为 ZipEightByteInteger 对象,如果 zip 条目中不存在此类时间戳,则返回 ZipEightByteInteger.ZERO
int hashCode()
void parseFromCentralDirectoryData(byte[] buffer, int offset, int length)
void parseFromLocalFileData(byte[] data, int offset, int length)
void setAccessJavaTime(Date d)
void setAccessTime(ZipEightByteInteger t)
void setCreateJavaTime(Date d)
void setCreateTime(ZipEightByteInteger t)
void setModifyJavaTime(Date d)
void setModifyTime(ZipEightByteInteger t)
String toString()

X0014_X509Certificates

  1. public class X0014_X509Certificates extends PKWareExtraHeader

PKCS#7 存储 X.509 证书 (0x0014)。

该字段必须包含有关每个可能签名的证书文件的信息。 当 ZIP 文件启用中央目录加密功能时,此记录将出现在归档额外数据记录中,否则它将出现在第一个中央目录记录中,并且在任何其他记录中将被忽略。

注意:所有字段以 Intel 低字节/高字节顺序存储。

  1. Value Size Description
  2. ----- ---- -----------
  3. (Store) 0x0014 2 bytes Tag for this "extra" block type
  4. TSize 2 bytes Size of the store data
  5. TData TSize Data about the store

X0015_CertificateIdForFile

  1. public class X0015_CertificateIdForFile extends PKWareExtraHeader

单个文件 (0x0015) 的 X.509 证书 ID 和签名。

此字段包含有关 PKCS#7 存储中的哪个证书用于签署特定文件的信息。 它还包含签名数据。 此字段可以出现多次,但每个证书只能出现一次。

注意:所有字段以 Intel 低字节/高字节顺序存储。

  1. Value Size Description
  2. ----- ---- -----------
  3. (CID) 0x0015 2 bytes Tag for this "extra" block type
  4. TSize 2 bytes Size of data that follows
  5. RCount 4 bytes Number of recipients. (inferred)
  6. HashAlg 2 bytes Hash algorithm identifier. (inferred)
  7. TData TSize Signature Data

X0016_CertificateIdForCentralDirectory

  1. public class X0016_CertificateIdForCentralDirectory extends PKWareExtraHeader

中央目录 (0x0016) 的 X.509 证书 ID 和签名。

此字段包含有关 PKCS#7 存储中的哪个证书用于签署中央目录结构的信息。 当 ZIP 文件启用中央目录加密功能时,该记录将出现在存档额外数据记录中,否则将出现在第一条中央目录记录中。

注意:所有字段以 Intel 低字节/高字节顺序存储。

  1. Value Size Description
  2. ----- ---- -----------
  3. (CDID) 0x0016 2 bytes Tag for this "extra" block type
  4. TSize 2 bytes Size of data that follows
  5. RCount 4 bytes Number of recipients. (inferred)
  6. HashAlg 2 bytes Hash algorithm identifier. (inferred)
  7. TData TSize Data

X0017_StrongEncryptionHeader

  1. public class X0017_StrongEncryptionHeader extends PKWareExtraHeader

强加密头部 (0x0017)。

基于证书的加密:

  1. Value Size Description
  2. ----- ---- -----------
  3. 0x0017 2 bytes Tag for this "extra" block type
  4. TSize 2 bytes Size of data that follows
  5. Format 2 bytes Format definition for this record
  6. AlgID 2 bytes Encryption algorithm identifier
  7. Bitlen 2 bytes Bit length of encryption key (32-448 bits)
  8. Flags 2 bytes Processing flags
  9. RCount 4 bytes Number of recipients.
  10. HashAlg 2 bytes Hash algorithm identifier
  11. HSize 2 bytes Hash size
  12. SRList (var) Simple list of recipients hashed public keys

Flags

  • 0x0007 - 保留供将来使用
  • 0x000F - 保留供将来使用
  • 0x0100 - 表示使用了非 OAEP 密钥包装。 如果设置了此字段,则需要提取的版本必须至少为 61。这意味着使用 ErdData 生成主会话密钥时不使用 OAEP 密钥包装
  • 0x4000 - ErdData 必须使用 3DES-168 解密,否则使用用于加密文件内容的相同算法
  • 0x8000 - 保留供将来使用

RCount
定义了预期接收者的数量,其公钥用于加密。 这标识SRList 中的元素数量。

HSize
定义了散列公钥的大小。

SRList
这是散列的可变长度列表每个预期收件人的公钥。 每个此列表中的元素是 HSize。 总规模SRList 使用 RCount * HSize 确定。

仅在中心标头中基于密码的额外字段 0x0017。

  1. Value Size Description
  2. ----- ---- -----------
  3. 0x0017 2 bytes Tag for this "extra" block type
  4. TSize 2 bytes Size of data that follows
  5. Format 2 bytes Format definition for this record
  6. AlgID 2 bytes Encryption algorithm identifier
  7. Bitlen 2 bytes Bit length of encryption key (32-448 bits)
  8. Flags 2 bytes Processing flags
  9. (more?)

Format
此记录的数据格式标识符。 此时唯一允许的值是整数值 2。

压缩文件数据前基于密码的额外字段 0x0017。

  1. Value Size Description
  2. ----- ---- -----------
  3. 0x0017 2 bytes Tag for this "extra" block type
  4. IVSize 2 bytes Size of initialization vector (IV)
  5. IVData IVSize Initialization vector for this file
  6. Size 4 bytes Size of remaining decryption header data
  7. Format 2 bytes Format definition for this record
  8. AlgID 2 bytes Encryption algorithm identifier
  9. Bitlen 2 bytes Bit length of encryption key (32-448 bits)
  10. Flags 2 bytes Processing flags
  11. ErdSize 2 bytes Size of Encrypted Random Data
  12. ErdData ErdSize Encrypted Random Data
  13. Reserved1 4 bytes Reserved certificate processing data
  14. Reserved2 (var) Reserved for certificate processing data
  15. VSize 2 bytes Size of password validation data
  16. VData VSize-4 Password validation data
  17. VCRC32 4 bytes Standard ZIP CRC32 of password validation data

IVData
IV 的大小应与算法块大小相匹配。IVData 可以是完全随机的数据。如果随机生成的数据大小与块大小不匹配它应该用零补充或截断。如果 IVSize 为 0,则 IV = CRC32 + 未压缩文件大小(作为 64 位 little-endian,无符号整数值)。

Format
此记录的数据格式标识符。唯一的此时允许的值为整数值 2。

ErdData
用来存储为加密每个文件而生成的文件会话key的随机数据的加密随机数。 SHA1 用于计算哈希数据派生密钥。文件会话密钥是从主服务器派生的从用户提供的密码生成的会话密钥。如果解密头中的 Flags 字段包含值 0x4000,则 ErdData 字段必须是使用 3DES 解密。如果未设置值 0x4000,那么 ErdData 字段必须使用 AlgId 解密。

Reserved1
为证书处理保留,如果值为零,则 Reserved2 数据不存在。看说明根据证书处理方法了解详情这个数据结构。

Reserved2
如果存在,Reserved2 数据结构的大小通过跳过该字段的前 4 个字节来定位并使用接下来的 2 个字节作为剩余大小。看证书处理方法下的解释有关此数据结构的详细信息。

VSize
这个大小值将始终包括 4 个字节VCRC32 数据将大于 4 个字节

VData
用于密码验证的随机数据。这个数据是 VSize长度和 VSize 必须是加密的倍数块大小。 VCRC32 是 VData 的校验和值。VData 和 VCRC32 被加密存储并启动文件的加密数据流。

Reserved1 - 证书解密标头 Reserved1 数据:

  1. Value Size Description
  2. ----- ---- -----------
  3. RCount 4 bytes Number of recipients.

RCount - 定义了其公钥用于加密的预期收件人的数量。 这定义了下面定义的 REList 字段中的元素数量。

Reserved2 - 证书解密头 Reserved2 数据结构:

  1. Value Size Description
  2. ----- ---- -----------
  3. HashAlg 2 bytes Hash algorithm identifier
  4. HSize 2 bytes Hash size
  5. REList (var) List of recipient data elements
  6. HashAlg - This defines the hash algorithm used to calculate
  7. the public key hash of each public key used
  8. for encryption. This field currently supports
  9. only the following value for SHA-1
  10. 0x8004 - SHA1
  11. HSize - This defines the size of a hashed public key
  12. defined in REHData.
  13. REList - This is a variable length of list of recipient data.
  14. Each element in this list consists of a Recipient
  15. Element data structure as follows:

收件人元素 (REList) 数据结构:

  1. Value Size Description
  2. ----- ---- -----------
  3. RESize 2 bytes Size of REHData + REKData
  4. REHData HSize Hash of recipients public key
  5. REKData (var) Simple key blob
  6. RESize - This defines the size of an individual REList
  7. element. This value is the combined size of the
  8. REHData field + REKData field. REHData is defined by
  9. HSize. REKData is variable and can be calculated
  10. for each REList element using RESize and HSize.
  11. REHData - Hashed public key for this recipient.
  12. REKData - Simple Key Blob. The format of this data structure
  13. is identical to that defined in the Microsoft
  14. CryptoAPI and generated using the CryptExportKey()
  15. function. The version of the Simple Key Blob
  16. supported at this time is 0x02 as defined by
  17. Microsoft.
  18. For more details see https://msdn.microsoft.com/en-us/library/aa920051.aspx

Flags - 处理解密所需的标志

  • 0x0001 - 需要密码才能解密
  • 0x0002 - 仅证书
  • 0x0003 - 解密需要密码或证书
  • 0x0007 - 保留供将来使用
  • 0x000F - 保留供将来使用
  • 0x0100 - 表示使用了非 OAEP 密钥包装。 如果设置了此字段,则提取所需的版本必须至少为 61。这意味着使用 ErdData 生成主会话密钥时不使用 OAEP 密钥包装
  • 0x4000 - ErdData 必须使用 3DES-168 解密,否则使用用于加密文件内容的相同算法
  • 0x8000 - 保留供将来使用 | Modifier and Type | Method and Description | | —- | —- | | PKWareExtraHeader.EncryptionAlgorithm | getEncryptionAlgorithm()
    获取加密算法 | | PKWareExtraHeader.HashAlgorithm | getHashAlgorithm()
    获取HASH算法 | | long | getRecordCount()
    获取记录数量 | | void | parseCentralDirectoryFormat(byte[] data, int offset, int length)
    解析中央目录格式 | | void | parseFileFormat(byte[] data, int offset, int length)
    解析文件头部格式 | | void | parseFromCentralDirectoryData(byte[] data, int offset, int length)
    从此数组中填充数据,就好像它在中央目录数据中一样 | | void | parseFromLocalFileData(byte[] data, int offset, int length)
    从此数组中填充数据,就好像它在本地文件数据中一样。 |

X0019_EncryptionRecipientCertificateList

  1. public class X0019_EncryptionRecipientCertificateList
  2. extends PKWareExtraHeader

PKCS#7 加密收件人证书列表 (0x0019)。

该字段可以包含有关加密处理中使用的每个证书的信息,并且可以用于识别允许解密加密文件的人。 此字段应仅出现在存档额外数据记录中。 此字段不是必需的,仅用于通过保留公共加密密钥数据来帮助存档修改。 个人安全要求可能会要求省略这些数据以阻止信息泄露。

注意:所有字段以 Intel 低字节/高字节顺序存储

  1. Value Size Description
  2. ----- ---- -----------
  3. (CStore) 0x0019 2 bytes Tag for this "extra" block type
  4. TSize 2 bytes Size of the store data
  5. Version 2 bytes Format version number - must 0x0001 at this time
  6. CStore (var) PKCS#7 data blob

X5455_ExtendedTimestamp

  1. public class X5455_ExtendedTimestamp
  2. extends Object
  3. implements ZipExtraField, Cloneable, Serializable

一个额外的字段,用于存储 zip 条目的附加文件和目录时间戳数据。每个 zip 条目最多可以包含三个时间戳(修改、访问、创建*)。时间戳存储为 32 位有符号整数,表示自 UNIX 纪元(1970 年 1 月 1 日,UTC)以来的秒数。该字段改进了 zip 的默认时间戳粒度,因为它允许存储额外的时间戳,此外,时间戳使用每秒粒度存储(zip 的默认行为只能将时间戳存储到最接近的偶数秒)。

不幸的是,32(有符号)位只能存储 2037 年之前的日期,因此这个额外的字段最终将被淘汰。在它持续的时候享受它!

  • modifyTime:文件/目录修改的最近时间(或文件/目录创建,如果条目自创建后未修改)
  • accessTime:最近打开文件/目录的时间(例如,从磁盘读取)。许多人使用 NOATIME 挂载选项禁止他们的操作系统更新此值以优化磁盘行为,因此它并不总是可靠的。在这些情况下,它总是等于 modifyTime
  • *createTime:现代 linux 文件系统(例如 ext2 和更新版本)似乎不会存储这样的值,因此通常在 zip 额外字段中完全省略它。也许其他 Unix 系统会跟踪这一点

我们使用 Info-Zip 源存档中给出的字段定义:zip-3.0.tar.gz/proginfo/extrafld.txt

  1. Value Size Description
  2. ----- ---- -----------
  3. 0x5455 Short tag for this extra block type ("UT")
  4. TSize Short total data size for this block
  5. Flags Byte info bits
  6. (ModTime) Long time of last modification (UTC/GMT)
  7. (AcTime) Long time of last access (UTC/GMT)
  8. (CrTime) Long time of original creation (UTC/GMT)
  9. Central-header version:
  10. Value Size Description
  11. ----- ---- -----------
  12. 0x5455 Short tag for this extra block type ("UT")
  13. TSize Short total data size for this block
  14. Flags Byte info bits (refers to local header!)
  15. (ModTime) Long time of last modification (UTC/GMT)
Modifier and Type Method and Description
Object clone()
boolean equals(Object o)
Date getAccessJavaTime()
以该 zip 条目的 java.util.Date 形式返回访问时间,如果 zip 条目中不存在此类时间戳,则返回 null。
ZipLong getAccessTime()
以 ZipLong 对象的形式返回此 zip 条目的访问时间(自纪元以来的秒数),如果 zip 条目中不存在此类时间戳,则返回 null。
byte[] getCentralDirectoryData()
ZipShort getCentralDirectoryLength()
Date getCreateJavaTime()
以该 zip 条目的 java.util.Date 形式返回创建时间,如果 zip 条目中不存在此类时间戳,则返回 null。
ZipLong getCreateTime()
以 ZipLong 对象的形式返回此 zip 条目的创建时间(自纪元以来的秒数),如果 zip 条目中不存在此类时间戳,则返回 null。
byte getFlags()
ZipShort getHeaderId()
byte[] getLocalFileDataData()
ZipShort getLocalFileDataLength()
Date getModifyJavaTime()
ZipLong getModifyTime()
int hashCode()
boolean isBit0_modifyTimePresent()
返回flags字节的 bit0 是否已设置,表示此特定 zip 条目中是否存在修改时间戳
boolean isBit1_accessTimePresent()
返回flags字节的 bit1 是否已设置,表示此特定 zip 条目中是否存在最后访问时间戳
boolean isBit2_createTimePresent()
返回flags字节的 bit2 是否已设置,表示此特定 zip 条目中是否存在创建时间戳
void parseFromCentralDirectoryData(byte[] buffer, int offset, int length)
void parseFromLocalFileData(byte[] data, int offset, int length)
void setAccessJavaTime(Date d)
void setAccessTime(ZipLong l)
void setCreateJavaTime(Date d)
void setCreateTime(ZipLong l)
void setFlags(byte flags)
void setModifyJavaTime(Date d)
void setModifyTime(ZipLong l)
String toString()

X7875_NewUnix

  1. public class X7875_NewUnix
  2. extends Object
  3. implements ZipExtraField, Cloneable, Serializable

存储给定 zip 条目的 UNIX UID/GID 数据(所有者和组所有权)的额外字段。 我们使用 Info-Zip 源存档中给出的字段定义:zip-3.0.tar.gz/proginfo/extrafld.txt

本地头部(local-header)版本:

  1. Value Size Description
  2. ----- ---- -----------
  3. 0x7875 Short tag for this extra block type ("ux")
  4. TSize Short total data size for this block
  5. Version 1 byte version of this extra field, currently 1
  6. UIDSize 1 byte Size of UID field
  7. UID Variable UID for this entry (little endian)
  8. GIDSize 1 byte Size of GID field
  9. GID Variable GID for this entry (little endian)

中心头部(central-header)版本:

  1. Value Size Description
  2. ----- ---- -----------
  3. 0x7855 Short tag for this extra block type ("Ux")
  4. TSize Short total data size for this block (0)
Modifier and Type Method and Description
Object clone()
boolean equals(Object o)
byte[] getCentralDirectoryData()
ZipShort getCentralDirectoryLength()
long getGID()
ZipShort getHeaderId()
byte[] getLocalFileDataData()
ZipShort getLocalFileDataLength()
long getUID()
int hashCode()
void parseFromCentralDirectoryData(byte[] buffer, int offset, int length)
void parseFromLocalFileData(byte[] data, int offset, int length)
void setGID(long l)
void setUID(long l)
String toString()

Zip64ExtendedInformationExtraField

  1. public class Zip64ExtendedInformationExtraField
  2. extends Object
  3. implements ZipExtraField

保存使用 Zip64 功能的条目的大小和其他扩展信息。

目前 Commons Compress 不支持对中央目录进行加密,因此 APPNOTE.TXT 中关于屏蔽的注释不适用。

该实现依赖于从本地文件头读取的数据,并假设两个大小值始终存在。

Modifier and Type Method and Description
byte[] getCentralDirectoryData()
ZipShort getCentralDirectoryLength()
ZipEightByteInteger getCompressedSize()
存储在此额外字段中的压缩大小
ZipLong getDiskStartNumber()
存储在此额外字段中的磁盘起始编号
ZipShort getHeaderId()
byte[] getLocalFileDataData()
ZipShort getLocalFileDataLength()
ZipEightByteInteger getRelativeHeaderOffset()
存储在此额外字段中的相对头部偏移量
ZipEightByteInteger getSize()
存储在此额外字段中的未压缩大小
void parseFromCentralDirectoryData(byte[] buffer, int offset, int length)
void parseFromLocalFileData(byte[] buffer, int offset, int length)
void reparseCentralDirectoryData(boolean hasUncompressedSize, boolean hasCompressedSize, boolean hasRelativeHeaderOffset, boolean hasDiskStart)
解析从中央目录额外字段读取的原始字节,并了解哪些字段应该存在
void setCompressedSize(ZipEightByteInteger compressedSize)
void setDiskStartNumber(ZipLong ds)
void setRelativeHeaderOffset(ZipEightByteInteger rho)
void setSize(ZipEightByteInteger size)

ZipArchiveEntry

  1. public class ZipArchiveEntry
  2. extends ZipEntry
  3. implements ArchiveEntry, EntryStreamOffsets

添加更好地处理额外字段并提供对内部和外部文件属性的访问的扩展。

额外的数据预计将遵循 APPNOTE.TXT 的建议:

  • 额外的字节数组由一系列额外的字段组成
  • 每个额外的字段都以一个两字节的标头 id 开头,后跟一个保存剩余数据长度的两字节序列。

任何无法通过上述规则解析的额外数据将被视为“不可解析”的额外数据,并由此类的方法进行不同的处理。 如果尝试读取或写入不符合建议的额外数据,则 Apache Commons Compress 1.1 之前的版本将引发异常。

这个类不是线程安全的

Modifier and Type Method and Description
void addAsFirstExtraField(ZipExtraField ze)
添加额外字段 - 替换已存在的相同类型的额外字段。新的额外字段将是第一个
void addExtraField(ZipExtraField ze)
添加额外字段 - 替换已存在的相同类型的额外字段
Object clone()
boolean equals(Object obj)
protected int getAlignment()
获取当前配置的对齐方式
byte[] getCentralDirectoryExtra()
ZipArchiveEntry.CommentSource getCommentSource()
评论字段值的来源
long getDataOffset()
获取归档文件中数据流的偏移量
long getDiskNumberStart()
此条目开始的拆分段的编号
long getExternalAttributes()
检索外部文件属性
ZipExtraField getExtraField(ZipShort type)
通过header id 检索额外字段
ZipExtraField
[]
getExtraFields()
检索已成功解析的所有额外字段
ZipExtraField
[]
getExtraFields(boolean includeUnparseable)
检索所有额外字段
ZipExtraField
[]
getExtraFields(ExtraFieldParsingBehavior parsingBehavior)
检索所有额外字段。
GeneralPurposeBit getGeneralPurposeBit()
“通用位”字段
int getInternalAttributes()
检索内部文件属性
Date getLastModifiedDate()
使用 Date 包装 ZipEntry.getTime() 作为条目的最后修改日期
byte[] getLocalFileDataExtra()
检索本地文件数据的额外数据
protected long getLocalHeaderOffset()
int getMethod()
返回此条目的压缩方法,如果未指定压缩方法,则返回 -1
String getName()
ZipArchiveEntry.NameSource getNameSource()
名称字段值的来源
int getPlatform()
平台规范放入中央文件头的“版本制作者”部分
int getRawFlag()
The content of the flags field.
byte[] getRawName()
在使用配置或猜测的编码进行转换之前,返回组成名称的原始字节
long getSize()
获取条目数据的未压缩大小
int getUnixMode()
Unix 权限
UnparseableExtraFieldData getUnparseableExtraFieldData()
查找无法正确解析的额外字段数据
int getVersionMadeBy()
“版本制作者”字段
int getVersionRequired()
“扩展所需的版本”字段。
int hashCode()
boolean isDirectory()
boolean isStreamContiguous()
指示流是否连续
boolean isUnixSymlink()
如果此条目表示 unix 符号链接,则返回 true,在这种情况下,条目的内容包含符号链接的目标路径
void removeExtraField(ZipShort type)
移除一个额外字段
void removeUnparseableExtraFieldData()
移除一个未解析的额外字段
void setAlignment(int alignment)
void setCentralDirectoryExtra(byte[] b)
void setCommentSource(ZipArchiveEntry.CommentSource commentSource)
protected void setDataOffset(long dataOffset)
void setDiskNumberStart(long diskNumberStart)
void setExternalAttributes(long value)
protected void setExtra()
不幸的是 java.util.zip.ZipOutputStream 似乎直接访问了额外的数据,所以覆盖 getExtra 没有帮助——我们需要直接修改 super 的数据
void setExtra(byte[] extra)
将给定字节解析为额外的字段数据,并将任何不可解析的数据作为 UnparseableExtraFieldData 实例使用
void setExtraFields(ZipExtraField[] fields)
用新数组替换所有当前附加的额外字段
void setGeneralPurposeBit(GeneralPurposeBit b)
“通用位”字段
void setInternalAttributes(int value)
设置内部文件属性
protected void setLocalHeaderOffset(long localHeaderOffset)
void setMethod(int method)
protected void setName(String name)
protected void setName(String name, byte[] rawName)
使用原始字节和通过猜测或使用配置的编码从中创建的字符串来设置名称
void setNameSource(ZipArchiveEntry.NameSource nameSource)
protected void setPlatform(int platform)
Set the platform (UNIX or FAT).
void setRawFlag(int rawFlag)
void setSize(long size)
protected void setStreamContiguous(boolean isStreamContiguous)
void setTime(FileTime fileTime)
void setUnixMode(int mode)
void setVersionMadeBy(int versionMadeBy)
void setVersionRequired(int versionRequired)

ZipArchiveEntryRequest

ZipArchiveEntry 的线程安全表示,用于将条目添加到并行存档。

Modifier and Type Method and Description
static ZipArchiveEntryRequest createZipArchiveEntryRequest(ZipArchiveEntry zipArchiveEntry, InputStreamSupplier payloadSupplier)
Create a ZipArchiveEntryRequest
int getMethod()
压缩的方法
InputStream getPayloadStream()
将添加到此 zip 条目的有效负载

createZipArchiveEntryRequest

public static ZipArchiveEntryRequest createZipArchiveEntryRequest(ZipArchiveEntry zipArchiveEntry, InputStreamSupplier payloadSupplier)
创建 ZipArchiveEntryRequest

Parameters:
zipArchiveEntry - 要使用的条目
payloadSupplier - 将添加到 zip 条目的有效负载

Returns:
The newly created request

ZipArchiveInputStream

  1. public class ZipArchiveInputStream extends ArchiveInputStream
  2. implements InputStreamStatistics

实现一个可以读取 Zip 档案的输入流。

从 Apache Commons Compress 开始,它透明地支持 Zip64 扩展,因此单个条目和存档大于 4 GB 或超过 65536 个条目。

从文件读取时首选 ZipFile 类,因为 ZipArchiveInputStream 受限于在返回条目之前无法读取中央目录标题。 特别是 ZipArchiveInputStream

  • 可能会返回根本不属于中央目录的条目,不应将其视为存档的一部分
  • 可能会返回多个具有相同名称的条目
  • 不会返回内部或外部属性
  • 可能会返回不完整的额外字段数据
  • 如果存档使用数据描述符功能,则在到达下一个条目之前,可能会返回条目的未知大小和 CRC 值 | Modifier and Type | Method and Description | | —- | —- | | boolean | canReadEntryData(ArchiveEntry ae)
    此类是否能够读取给定条目 | | void | close() | | long | getCompressedCount() | | ArchiveEntry | getNextEntry()
    Returns the next Archive Entry in this Stream. | | ZipArchiveEntry | getNextZipEntry() | | long | getUncompressedCount() | | static boolean | matches(byte[] signature, int length)
    检查签名是否与 zip 文件的预期匹配 | | int | read(byte[] buffer, int offset, int length) | | long | skip(long value)
    跳过并丢弃此输入流中数据的值字节 |

ZipArchiveOutputStream

  1. public class ZipArchiveOutputStream extends ArchiveOutputStream

java.util.zip.ZipOutputStream 的重新实现,它确实处理了这个包的扩展功能,特别是内部/外部文件属性和具有不同布局的本地文件数据和中央目录条目的额外字段。

当此类知道输出将发送到文件并且不应创建拆分存档时,该类将尝试使用 SeekableByteChannel。

如果无法使用 SeekableByteChannel,此实现将使用 Data Descriptor 来存储 DEFLATED 条目的大小和 CRC 信息,这意味着您不需要自己计算它们。不幸的是,这对于 STORED 方法是不可能的,在调用 putArchiveEntry(ArchiveEntry) 之前需要设置 CRC 和未压缩的大小信息。

从 Apache Commons Compress 1.3 开始,它透明地支持 Zip64 扩展,因此在大多数情况下,单个条目和档案大于 4 GB 或超过 65536 个条目,但通过 setUseZip64(org.apache.commons.compress.archivers.zip. Zip64 模式)。如果流无法使用 SeekableByteChannel 并且您尝试编写未知大小的 ZipArchiveEntry,则默认情况下将禁用 Zip64 扩展。

这个类不是线程安全的

Modifier and Type Method and Description
void addRawArchiveEntry(ZipArchiveEntry entry, InputStream rawStream)
添加带有原始输入流的存档条目
boolean canWriteEntryData(ArchiveEntry ae)
此流是否能够写入给定条目
void close()
void closeArchiveEntry()
写入此条目的所有必要数据
ArchiveEntry createArchiveEntry(File inputFile, String entryName)
创建一个新的 zip 条目,从给定文件中获取一些信息并使用提供的名称
ArchiveEntry createArchiveEntry(Path inputPath, String entryName, LinkOption… options)
创建一个新的 zip 条目,从给定文件中获取一些信息并使用提供的名称
protected void deflate()
将下一个压缩数据块写入输出流
void finish()
完成向该流添加条目,而不关闭它
void flush()
刷新此输出流并强制将任何缓冲的输出字节写出到流中
String getEncoding()
boolean isSeekable()
void putArchiveEntry(ArchiveEntry archiveEntry)
将归档条目的标头写入输出流
void setComment(String comment)
void setCreateUnicodeExtraFields(ZipArchiveOutputStream.UnicodeExtraFieldPolicy b)
void setEncoding(String encoding)
void setFallbackToUTF8(boolean b)
如果无法使用指定的编码对文件名进行编码,是否回退到 UTF 和语言编码标志
void setLevel(int level)
设置后续条目的压缩级别
void setMethod(int method)
设置后续条目的压缩方法
void setUseLanguageEncodingFlag(boolean b)
如果文件名编码为 UTF-8,是否设置语言编码标志
void setUseZip64(Zip64Mode mode)
是否将使用 Zip64 扩展
void write(byte[] b, int offset, int length)
写入字节数组到 ZIP 条目
protected void writeCentralDirectoryEnd()
写入“中央目录记录结束”
protected void writeCentralFileHeader(ZipArchiveEntry ze)
写入中央文件头条目
protected void writeDataDescriptor(ZipArchiveEntry ze)
写入数据描述符条目
protected void writeLocalFileHeader(ZipArchiveEntry ze)
写入本地文件头条目
protected void writeOut(byte[] data)
将字节写入输出或随机访问文件
protected void writeOut(byte[] data, int offset, int length)
将字节写入输出或随机访问文件
void writePreamble(byte[] preamble)
写入前导数据
void writePreamble(byte[] preamble, int offset, int length)
写入前导数据
protected void writeZip64CentralDirectory()
写入“ZIP64 End of central dir record”和“ZIP64 End of central dir locator”

ZipArchiveOutputStream.UnicodeExtraFieldPolicy

表示创建 Unicode 额外字段的可能策略的枚举

Modifier and Type Field and Description
static ZipArchiveOutputStream.UnicodeExtraFieldPolicy ALWAYS
始终创建 Unicode 额外字段
static ZipArchiveOutputStream.UnicodeExtraFieldPolicy NEVER
从不创建 Unicode 额外字段
static ZipArchiveOutputStream.UnicodeExtraFieldPolicy NOT_ENCODEABLE
为无法使用指定编码进行编码的文件名创建 Unicode 额外字段

ZipEightByteInteger

表示具有 ZIP 文件小端字节顺序转换规则的八字节整数的工具类

Modifier and Type Method and Description
boolean equals(Object o)
byte[] getBytes()
以大端字节顺序获取 8 个字节的值
static byte[] getBytes(BigInteger value)
以大端字节顺序获取 8 个字节的值
static byte[] getBytes(long value)
以大端字节顺序获取 8 个字节的值
long getLongValue()
获取一个 java long类型的值
static long getLongValue(byte[] bytes)
从八字节数组中获取 Java long 值的辅助方法
static long getLongValue(byte[] bytes, int offset)
从给定数组偏移量开始的 8 个字节获取 Java long 值的辅助方法
BigInteger getValue()
Get value as Java BigInteger.
static BigInteger getValue(byte[] bytes)
从八字节数组中获取 Java long 值的辅助方法
static BigInteger getValue(byte[] bytes, int offset)
从给定数组偏移量开始的八个字节中获取 Java BigInteger 值的辅助方法
int hashCode()
String toString()

ZipEncodingHelper

用于在 zip 文件中对文件名进行稳健编码的静态辅助函数

Modifier and Type Method and Description
static ZipEncoding getZipEncoding(String name)
Instantiates a zip encoding.

ZipFile

替换 java.util.ZipFile。

此类添加了对 UTF-8 以外的文件名编码的支持(这是处理由本地 zip 工具创建的 ZIP 文件所必需的,并且能够像在自解压档案中找到的那样跳过序言。此外,它返回 org.apache.commons.compress.archivers.zip.ZipArchiveEntry 的实例而不是 java.util.zip.ZipEntry。

该类并没有继承至 java.util.zip.ZipFile,因为无论如何它都必须重新实现所有方法。与 java.util.ZipFile 一样,它在后台使用 SeekableByteChannel 并支持压缩和未压缩条目。从 Apache Commons Compress 1.3 开始,它还透明地支持 Zip64 扩展,因此单个条目和存档大于 4 GB 或超过 65536 个条目。

方法签名模仿 java.util.zip.ZipFile 的方法签名,但有几个例外:

  • 没有 getName 方法
  • 条目已重命名为 getEntries
  • getEntries 和 getEntry 返回 org.apache.commons.compress.archivers.zip.ZipArchiveEntry 实例
  • close 允许抛出 IOException

Constructors

Constructor and Description
ZipFile(File f)
打开给定文件进行读取,假定文件名为“UTF8”编码
ZipFile(File f, String encoding)
打开给定的文件进行读取,假设文件名的指定编码并扫描 unicode 额外字段
ZipFile(File f, String encoding, boolean useUnicodeExtraFields)
打开给定的文件进行读取,假定文件名的指定编码
ZipFile(File f, String encoding, boolean useUnicodeExtraFields, boolean ignoreLocalFileHeader)
打开给定的文件进行读取,假定文件名的指定编码
ZipFile(SeekableByteChannel channel)
打开给定的通道进行读取,假设文件名为“UTF8”编码
ZipFile(SeekableByteChannel channel, String encoding)
假设文件名的指定编码,打开给定的通道进行读取
ZipFile(SeekableByteChannel channel, String archiveName, String encoding, boolean useUnicodeExtraFields)
假设文件名的指定编码,打开给定的通道进行读取
ZipFile(SeekableByteChannel channel, String archiveName, String encoding, boolean useUnicodeExtraFields, boolean ignoreLocalFileHeader)
假设文件名的指定编码,打开给定的通道进行读取
ZipFile(String name)
打开给定的文件进行读取,假设文件名为“UTF8”编码
ZipFile(String name, String encoding)
打开给定文件进行读取,假设文件名的指定编码,扫描 unicode 额外字段

Methods

Modifier and Type Method and Description
boolean canReadEntryData(ZipArchiveEntry ze)
此类是否能够读取给定条目
void close()
static void closeQuietly(ZipFile zipfile)
静默关闭一个压缩文件; 不抛出 io 错误,对 null 参数不执行任何操作
void copyRawEntries(ZipArchiveOutputStream target, ZipArchiveEntryPredicate
predicate)
将此压缩文件中的选定条目传输到给定的#ZipArchiveOutputStream
protected void finalize()
String getEncoding()
Enumeration[ZipArchiveEntry](https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.html) getEntries()
返回所有条目
Iterable[ZipArchiveEntry](https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.html) getEntries(String name)
以它们在档案中心目录中出现的相同顺序返回所有命名条目
Enumeration[ZipArchiveEntry](https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.html) getEntriesInPhysicalOrder()
按物理顺序返回所有条目
Iterable[ZipArchiveEntry](https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.html) getEntriesInPhysicalOrder(String name)
以它们的内容出现在档案中的相同顺序返回所有命名条目
ZipArchiveEntry getEntry(String name)
返回一个命名条目 - 如果不存在该名称的条目,则返回 null
InputStream getInputStream(ZipArchiveEntry ze)
返回一个 InputStream 用于读取给定条目的内容
InputStream getRawInputStream(ZipArchiveEntry ze)
公开存档条目的原始流(压缩形式)
String getUnixSymlink(ZipArchiveEntry entry)
如果 isUnixSymlink() 为其返回 true,则将条目的内容作为 String 返回的便捷方法,否则返回 null

ZipLong

表示具有 ZIP 文件小端字节顺序转换规则的四字节整数的工具类

Fields

Modifier and Type Field and Description
static ZipLong AED_SIG
归档额外数据记录签名
static ZipLong CFH_SIG
中心文件头部签名
static ZipLong DD_SIG
数据描述符签名
static ZipLong LFH_SIG
本地文件头部签名
static ZipLong SINGLE_SEGMENT_SPLIT_MARKER
标记应该拆分或跨越但最后只需要一个片段的 ZIP 档案(因此实际上既不拆分也不跨越)

Methods

Modifier and Type Method and Description
Object clone()
boolean equals(Object o)
byte[] getBytes()
以大端字节顺序获取四个字节的值
static byte[] getBytes(long value)
以大端字节顺序获取四个字节的值
int getIntValue()
获取 java int 值(作为签名)
long getValue()
获取 Java long 的值
static long getValue(byte[] bytes)
从四字节数组中获取 Java long 值的辅助方法
static long getValue(byte[] bytes, int offset)
从给定数组偏移量开始的四个字节获取 Java long 值的辅助方法
int hashCode()
void putLong(byte[] buf, int offset)
static void putLong(long value, byte[] buf, int offset)
String toString()

ZipShort

表示具有 ZIP 文件小端字节顺序转换规则的两字节整数的工具类

Modifier and Type Method and Description
Object clone()
boolean equals(Object o)
byte[] getBytes()
以大端字节顺序获取两个字节的值
static byte[] getBytes(int value)
以大端字节顺序获取两字节的值
long getValue()
获取 Java int 的值
static long getValue(byte[] bytes)
从两字节数组中获取 Java long 值的辅助方法
static long getValue(byte[] bytes, int offset)
从给定数组偏移量开始的两个字节获取 Java long 值的辅助方法
int hashCode()
static void putShort(int value, byte[] buf, int offset)
String toString()

ZipSplitReadOnlySeekableByteChannel

  1. public class ZipSplitReadOnlySeekableByteChannel extends MultiReadOnlySeekableByteChannel

MultiReadOnlySeekableByteChannel 知道拆分的 ZIP 存档应该是什么样子。

如果您想使用 ZipFile 读取拆分存档,则从存档的各个部分创建此类的实例。

Modifier and Type Method and Description
static SeekableByteChannel buildFromLastSplitSegment(File lastSegmentFile)
从最后一段连接 zip 拆分文件(扩展名应该是 .zip
static SeekableByteChannel forFiles(File… files)
连接给定的文件
static SeekableByteChannel forFiles(File lastSegmentFile, Iterable[File](https://docs.oracle.com/javase/7/docs/api/java/io/File.html?is-external=true) files)
连接给定的文件
static SeekableByteChannel forOrderedSeekableByteChannels(SeekableByteChannel… channels)
连接给定的通道
static SeekableByteChannel forOrderedSeekableByteChannels(SeekableByteChannel lastSegmentChannel, Iterable[SeekableByteChannel](https://docs.oracle.com/javase/7/docs/api/java/nio/channels/SeekableByteChannel.html?is-external=true) channels)
连接给定的通道

ZipUtil

用于处理 DOS 和 Java 时间转换的工具类。

这个类是不可变的

Modifier and Type Method and Description
static long adjustToLong(int i)
假设一个负整数确实是一个正整数,它已经环绕并重新创建了原始值
static long dosToJavaTime(long dosTime)
将 DOS 时间转换为 Java 时间(自纪元以来的毫秒数)
static Date fromDosTime(ZipLong zipDosTime)
将 DOS 日期/时间字段转换为 Date 对象
static byte[] reverse(byte[] array)
反转 byte 数组
static int signedByteToUnsignedInt(byte b)
将有符号字节转换为无符号整数表示(例如,-1 变为 255)
static ZipLong toDosTime(Date time)
将 Date 对象转换为 DOS 日期/时间字段
static byte[] toDosTime(long t)
将 Date 对象转换为 DOS 日期/时间字段
static void toDosTime(long t, byte[] buf, int offset)
将 Date 对象转换为 DOS 日期/时间字段
static byte unsignedIntToSignedByte(int i)
将无符号整数转换为有符号字节(例如,255 变为 -1)

PKWareExtraHeader.EncryptionAlgorithm

  1. public static enum PKWareExtraHeader.EncryptionAlgorithm
  2. extends Enum<PKWareExtraHeader.EncryptionAlgorithm>
Enum Constant and Description
AES128
AES192
AES256
DES
RC2
RC2pre52
RC4
TripleDES168
TripleDES192
UNKNOWN

PKWareExtraHeader.HashAlgorithm

  1. public static enum PKWareExtraHeader.HashAlgorithm
  2. extends Enum<PKWareExtraHeader.HashAlgorithm>
Enum Constant and Description
CRC32
MD5
NONE
RIPEND160
SHA1
SHA256
SHA384
SHA512

Zip64Mode

  1. public enum Zip64Mode
  2. extends Enum<Zip64Mode>
Enum Constant and Description
Always
对所有条目使用 Zip64 扩展,即使很明显它不是必需的
AlwaysWithCompatibility
始终像 Always 一样对 LFH 和中央目录使用 Zip64 扩展,同时像 AsNeeded 一样在 CFH 中根据需要对 LFH 的相对偏移和磁盘编号 start 进行编码
AsNeeded
对所有需要的条目使用 Zip64 扩展,不要将它们用于明显不需要它们的条目
Never
任何条目都不使用 Zip64 扩展

ZipArchiveEntry.CommentSource

  1. public static enum ZipArchiveEntry.CommentSource
  2. extends Enum<ZipArchiveEntry.CommentSource>

指示如何确定此条目的注释

Enum Constant and Description
COMMENT
注释已使用创建 ZipArchiveInputStream 或 ZipFile 时指定的存档编码(默认为平台的默认编码)从存档中读取
UNICODE_EXTRA_FIELD
该注释已从 Unicode 额外字段中读取

ZipArchiveEntry.ExtraFieldParsingMode

  1. public static enum ZipArchiveEntry.ExtraFieldParsingMode
  2. extends Enum<ZipArchiveEntry.ExtraFieldParsingMode>
  3. implements ExtraFieldParsingBehavior

如何尝试解析额外的字段。

配置以下行为:

  • 如果额外的字段内容不遵循推荐的两字节 id 后跟两字节长度的模式,会发生什么?
  • 如果 Commons Compress 普遍支持额外的字段,但其内容无法正确解析,会发生什么情况? 例如,如果存档损坏、触发 Commons Compress 中的错误或额外字段使用 Commons Compress 不(尚)支持的版本,则可能会发生这种情况。 | Enum Constant and Description | | —- | | BEST_EFFORT
    尝试解析尽可能多的额外字段,并包装未知的额外字段以及无法在 UnrecognizedExtraField 中解析的受支持的额外字段 | | DRACONIC
    果无法解析任何已识别的额外字段或任何额外字段违反推荐模式,则抛出异常 | | ONLY_PARSEABLE_LENIENT
    Try to parse as many extra fields as possible and wrap unknown extra fields as well as supported extra fields that cannot be parsed in UnrecognizedExtraField. | | ONLY_PARSEABLE_STRICT
    尝试解析尽可能多的额外字段,并将未知的额外字段包装在 UnrecognizedExtraField 中 | | STRICT_FOR_KNOW_EXTRA_FIELDS
    尝试解析尽可能多的额外字段,并将未知的额外字段包装在 UnrecognizedExtraField 中 |

ZipArchiveEntry.NameSource

  1. public static enum ZipArchiveEntry.NameSource
  2. extends Enum<ZipArchiveEntry.NameSource>

指示如何确定此条目的名称

Enum Constant and Description
NAME
该名称已使用创建 ZipArchiveInputStream 或 ZipFile 时指定的存档编码(默认为平台的默认编码)
NAME_WITH_EFS_FLAG
该名称已从存档中读取,并且存档指定了 EFS 标志,该标志指示该名称已被编码为 UTF-8
UNICODE_EXTRA_FIELD
该名称已从 Unicode 额外字段中读取

ZipMethod

  1. public enum ZipMethod extends Enum<ZipMethod>

已知压缩方法列表 commons compress 目前不支持其中许多方法

Enum Constant and Description
AES_ENCRYPTED
AES 加密的压缩方法 99
BZIP2
bzip2的压缩方法12
DEFLATED
.压缩(deflate)条目的压缩方法 8
ENHANCED_DEFLATED
压缩方法 9 用于增强deflate
EXPANDING_LEVEL_1
随着压缩因子 1 减少
EXPANDING_LEVEL_2
随着压缩因子 2 减少
EXPANDING_LEVEL_3
随着压缩因子 3 减少
EXPANDING_LEVEL_4
随着压缩因子 4 减少
IMPLODING
Imploding - 内爆
JPEG
用于 Jpeg 压缩的压缩方法 96
LZMA
用于 LZMA 压缩的压缩方法 14
PKWARE_IMPLODING
PKWARE 数据压缩库内爆
PPMD
PPMd 的压缩方法 98
STORED
未压缩条目的压缩方法 0
TOKENIZATION
Tokenization.
UNKNOWN
Unknown compression method.
UNSHRINKING
UnShrinking - 不收缩
WAVPACK
WavPack 的压缩方法 97
XZ
XZ 的压缩方法 95

org.apache.commons.compress.compressors

CompressorStreamProvider

创建 Compressor CompressorInputStreams 和 CompressorOutputStreams。

Modifier and Type Method and Description
CompressorInputStream createCompressorInputStream(String name, InputStream in, boolean decompressUntilEOF)
从压缩器名称和输入流创建压缩器输入流
CompressorOutputStream createCompressorOutputStream(String name, OutputStream out)
从压缩器名称和输出流创建压缩器输出流
Set[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true) getInputStreamCompressorNames()
获取此 provider 的所有输入流压缩器名称
Set[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true) getOutputStreamCompressorNames()
获取此 provider 的所有输出流压缩器名称

CompressorStreamFactory

  1. public class CompressorStreamFactory extends Object
  2. implements CompressorStreamProvider

从名称创建 Compressor[In|Out]putStreams 的工厂。 要添加其他实现类,您应该继承 CompressorStreamFactory 并重写适当的方法(当然还要从 super 调用它们的实现)。

示例(压缩文件):

  1. final OutputStream out = Files.newOutputStream(output.toPath());
  2. CompressorOutputStream cos = new CompressorStreamFactory()
  3. .createCompressorOutputStream(CompressorStreamFactory.BZIP2, out);
  4. IOUtils.copy(Files.newInputStream(input.toPath()), cos);
  5. cos.close();

示例(解压缩文件):

  1. final InputStream is = Files.newInputStream(input.toPath());
  2. CompressorInputStream in = new CompressorStreamFactory().createCompressorInputStream(CompressorStreamFactory.BZIP2,
  3. is);
  4. IOUtils.copy(in, Fi

这个类是不可变的
前提是不使用已弃用的方法 setDecompressConcatenated。

这个类是线程安全的
即使使用了已弃用的方法 setDecompressConcatenated

Fields

Modifier and Type Field and Description
static String BROTLI
用于标识 BROTLI 压缩算法的常量(值“br”)
static String BZIP2
用于标识 BZIP2 压缩算法的常量(值“bzip2”)
static String DEFLATE
用于标识 DEPLATE 压缩算法的常量(值“deflate”)
static String DEFLATE64
用于标识 DEPLATE64 压缩算法的常量(值“deflate64”)
static String GZIP
用于标识 GZIP 压缩算法的常量(值“gz”)
static String LZ4_BLOCK
用于标识 LZ4 压缩算法的常量(值“lz4_block”)
static String LZ4_FRAMED
用于标识 LZ4 压缩算法的常量(值“lz4_framed”)
static String LZMA
用于标识 LZMA 压缩算法的常量(值“lzma”)
static String PACK200
用于标识 PACK200 压缩算法的常量(值“pack200”)
static String SNAPPY_FRAMED
常量(值“snappy-framed”)用于标识“框架”的 Snappy 压缩方法
static String SNAPPY_RAW
用于标识“原始”Snappy 压缩方法的常量(值“snappy-raw”)
static String XZ
Constant (value “xz”) used to identify the XZ compression method.
static String Z
用于标识传统 Unix 压缩方法的常量(值“z”)
static String ZSTANDARD
用于标识 Zstandard 压缩算法的常量(值“zstd”)

Methods

Modifier and Type Method and Description
CompressorInputStream createCompressorInputStream(InputStream in)
从输入流创建压缩器输入流,从流的前几个字节自动检测压缩器类型
CompressorInputStream createCompressorInputStream(String name, InputStream in)
从压缩器名称和输入流创建压缩器输入流
CompressorInputStream createCompressorInputStream(String name, InputStream
in, boolean actualDecompressConcatenated)
从压缩器名称和输入流创建压缩器输入流
CompressorOutputStream createCompressorOutputStream(String name, OutputStream out)
从压缩器名称和输出流创建压缩器输出流
static String detect(InputStream inputStream)
尝试检测压缩流的类型
static SortedMap<String
,CompressorStreamProvider>
findAvailableCompressorInputStreamProviders()
从输入流提供者名称到提供者对象构造一个新的排序映射
static SortedMap<String
,CompressorStreamProvider>
findAvailableCompressorOutputStreamProviders()
从输出流提供者名称到提供者对象构造一个新的排序映射
static String getBrotli()
static String getBzip2()
SortedMap<String
,CompressorStreamProvider>
getCompressorInputStreamProviders()
SortedMap[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true),[CompressorStreamProvider](https://commons.apache.org/proper/commons-compress/apidocs/org/apache/commons/compress/compressors/CompressorStreamProvider.html) getCompressorOutputStreamProviders()
Boolean getDecompressUntilEOF()
static String getDeflate()
static String getDeflate64()
static String getGzip()
Set[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true) getInputStreamCompressorNames()
获取此 provider 的所有输入流压缩器名称
static String getLZ4Block()
static String getLZ4Framed()
static String getLzma()
Set[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true) getOutputStreamCompressorNames()
获取此 provider 的所有输出流压缩器名称
static String getPack200()
static CompressorStreamFactory getSingleton()
static String getSnappyFramed()
static String getSnappyRaw()
static String getXz()
static String getZ()
static String getZstandard()
void setDecompressConcatenated(boolean decompressConcatenated)
Deprecated.
1.10 use the CompressorStreamFactory(boolean) constructor instead

CompressorInputStream

Modifier and Type Method and Description
protected void count(int read)
增加已读取字节的计数器
protected void count(long read)
增加已读取字节的计数器
long getBytesRead()
返回从此流中读取的当前字节数
int getCount()
Deprecated.
对于大型归档,此方法可能会产生错误的结果,请改用 #getBytesRead
long getUncompressedCount()
返回流读取的原始或压缩字节的数量
protected void pushedBackBytes(long pushedBack)
递减已读取字节的计数器

CompressorOutputStream

FileNameUtil

压缩格式的文件名映射代码

Modifier and Type Method and Description
String getCompressedFilename(String fileName)
将给定的文件名映射到压缩后文件应具有的名称
String getUncompressedFilename(String fileName)
将压缩文件的给定名称映射到解压缩后文件应具有的名称
boolean isCompressedFilename(String fileName)
检测给定文件名中的常见格式后缀

org.apache.commons.compress.compressors.gzip

GzipCompressorInputStream

  1. public class GzipCompressorInputStream
  2. extends CompressorInputStream
  3. implements InputStreamStatistics

解压缩 .gz 文件的输入流。支持解压缩连接的 .gz 文件,这在解压缩独立 .gz 文件时很重要。

GZIPInputStream 不解压缩连接的 .gz 文件:它在第一个成员之后停止并默默地忽略其余部分。它不会让读取位置指向下一个成员的开头,这使得解决缺乏连接支持的问题变得困难。

这个类没有使用 GZIPInputStream,而是有自己的 .gz 容器格式解码器。实际的解压缩是用 Inflater 完成的。

如果您使用带有一些 InputStream 的构造函数 GzipCompressorInputStream(in) 或 GzipCompressorInputStream(in, false),那么一旦第一个内部成员被完全读取,read() 将返回 -1。如果有第二个 gzip 成员,则输入流将定位在第二个 gzip 成员的开头。

如果您使用带有一些 InputStream 的构造函数 GzipCompressorInputStream(in, true) ,那么一旦输入的流耗尽,read() 将返回 -1。从以这种方式构造的流中读取的数据将包含其中包含的所有 gzip 成员的连接数据。

也可以看看:
https://tools.ietf.org/html/rfc1952

Modifier and Type Method and Description
void close()
Closes the input stream (unless it is System.in).
long getCompressedCount()
GzipParameters getMetaData()
提供流的元数据 - 解压缩连接流时可能随每个流而变化
static boolean matches(byte[] signature, int length)
检查签名是否与 .gz 文件的预期匹配
int read()
int read(byte[] b, int off, int len)

GzipCompressorOutputStream

  1. public class GzipCompressorOutputStream
  2. extends CompressorOutputStream

使用 gzip 格式的压缩输出流。 此实现通过允许配置压缩级别和标头元数据(文件名、注释、修改时间、操作系统和额外标志)来改进标准 GZIPOutputStream 类。

也可以看看:GZIP File Format Specification

Modifier and Type Method and Description
void close()
void finish()
完成将压缩数据写入底层流而不关闭它
void flush()
void write(byte[] buffer)
void write(byte[] buffer, int offset, int length)
void write(int b)

GzipParameters

GZIP 压缩器使用到的参数器

Modifier and Type Method and Description
int getBufferSize()
获取用于检索压缩数据的缓冲区的大小
String getComment()
int getCompressionLevel()
String getFilename()
long getModificationTime()
int getOperatingSystem()
void setBufferSize(int bufferSize)
设置用于从 Deflater 检索压缩数据并写入底层 OutputStream 的缓冲区大小
void setComment(String comment)
void setCompressionLevel(int compressionLevel)
void setFilename(String fileName)
设置压缩文件的名称
void setModificationTime(long modificationTime)
设置压缩文件的修改时间
void setOperatingSystem(int operatingSystem)
设置进行压缩的操作系统。默认值如下:
- 0: FAT file system (MS-DOS, OS/2, NT/Win32)
- 1: Amiga
- 2: VMS (or OpenVMS)
- 3: Unix
- 4: VM/CMS
- 5: Atari TOS
- 6: HPFS file system (OS/2, NT)
- 7: Macintosh
- 8: Z-System
- 9: CP/M
- 10: TOPS-20
- 11: NTFS file system (NT)
- 12: QDOS
- 13: Acorn RISCOS
- 255: Unknown

GzipUtils

GZIP 压缩格式工具代码

Modifier and Type Method and Description
static String getCompressedFilename(String fileName)
将给定的文件名映射到使用 gzip 压缩后文件应具有的名称
static String getUncompressedFilename(String fileName)
将 gzip 压缩文件的给定名称映射到解压缩后文件应具有的名称
static boolean isCompressedFilename(String fileName)
检测给定文件名中的常见 gzip 后缀

org.apache.commons.compress.compressors.gzip

ChangeSet

ChangeSet 收集并执行对存档的更改。 从多个线程中将删除更改放入此 ChangeSet 中可能会导致冲突。

这个类不是线程安全的

Modifier and Type Method and Description
void add(ArchiveEntry pEntry, InputStream pInput)
将新的存档条目添加到存档
void add(ArchiveEntry pEntry, InputStream pInput, boolean replace)
将新的存档条目添加到存档
void delete(String fileName)
从存档中删除具有文件名的文件
void deleteDir(String dirName)
从存档中删除目录树

ChangeSetPerformer

对流执行 ChangeSet 操作。 这个类是线程安全的,可以多次使用。 它对 ChangeSet 的副本进行操作。 如果 ChangeSet 发生变化,则必须创建一个新的 Performer。

这个类是不可变的

这个类是线程安全的

Modifier and Type Method and Description
ChangeSetResults perform(ArchiveInputStream in, ArchiveOutputStream out)
对输入流执行此 ChangeSet 中收集的所有更改,并将结果流式传输到输出流
ChangeSetResults perform(ZipFile in, ArchiveOutputStream out)
对 ZipFile 执行此 ChangeSet 中收集的所有更改,并将结果流式传输到输出流

ChangeSetResults

存储执行的 ChangeSet 操作的结果

Modifier and Type Method and Description
List[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true) getAddedFromChangeSet()
返回从变更集中添加的文件名列表
List[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true) getAddedFromStream()
返回从原始流中添加的文件名列表
List[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true) getDeleted()
返回已删除的文件名列表

org.apache.commons.compress.java.util.jar

Pack200.Packer

定义用于将 JAR 文件转换为 Pack200 格式的输出流的 API 的接口

Fields

Modifier and Type Field and Description
static String CLASS_ATTRIBUTE_PFX
类属性名称的格式
static String CODE_ATTRIBUTE_PFX
代码属性名称的格式
static String DEFLATE_HINT
在输出存档中设置的 deflation 提示
static String EFFORT
压缩档案时使用的指示量
static String ERROR
error 的字符串表示形式
static String FALSE
false 的字符串表示形式
static String FIELD_ATTRIBUTE_PFX
字段属性名称的格式
static String KEEP
keep 的字符串表示形式
static String KEEP_FILE_ORDER
决定是否所有元素都应按其原始顺序传输
static String LATEST
latest 的字符串表示形式
static String METHOD_ATTRIBUTE_PFX
方法属性名称的格式
static String MODIFICATION_TIME
如果设置为 LATEST,则它应尝试确定最新的修改时间
static String PASS
pass 的字符串表示形式
static String PASS_FILE_PFX
不会被压缩的文件
static String PROGRESS
packer 进度百分比
static String SEGMENT_LIMIT
每个归档段的字节数
static String STRIP
strip 的字符串表示形式
static String TRUE
true 的字符串表示形式
static String UNKNOWN_ATTRIBUTE
遇到未知属性时要采取的操作

Methods

Modifier and Type Method and Description
void addPropertyChangeListener(PropertyChangeListener listener)
为 PropertyChange 事件添加监听器
void pack(JarFile in, OutputStream out)
将指定的 JAR 文件打包到指定的输出流
void pack(JarInputStream in, OutputStream out)
将指定jar输入流中的数据打包到指定输出流中
SortedMap[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true),[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true) properties()
返回此 packer 属性的排序映射
void removePropertyChangeListener(PropertyChangeListener listener)
移除监听器

Pack200.Unpacker

定义用于将 Pack200 格式的打包流转换为 JAR 文件的 API 的接口。

Fields

Modifier and Type Field and Description
static String DEFLATE_HINT
指示 unpacker 是否应忽略所有传输值的字符串,可以用 true 或 false 替换
static String FALSE
false 的字符串表示形式
static String KEEP
keep 的字符串表示形式
static String PROGRESS
进度百分比
static String TRUE
true 的字符串表示形式

Methods

Modifier and Type Method and Description
void addPropertyChangeListener(PropertyChangeListener listener)
为 PropertyChange 事件添加侦听器
SortedMap[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true),[String](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true) properties()
返回此 unpacker 属性的排序映射
void removePropertyChangeListener(PropertyChangeListener listener)
移除监听器
void unpack(File in, JarOutputStream out)
将指定 File 的内容解包到指定的 JAR 输出流
void unpack(InputStream in, JarOutputStream out)
将指定的流解包到指定的 JAR 输出流

org.apache.commons.compress.parallel

InputStreamSupplier

提供输入流。 需要实现来支持线程切换。 虽然一个实例不会被多个线程同时访问,但它将由与创建它的线程不同的线程调用。

Modifier and Type Method and Description
InputStream get
()
Supply an input stream for a resource.

ScatterGatherBackingStore

在分散-收集方案中存储中间有效负载。 多个线程将其有效负载写入后备存储,随后可以将其反转为 InputStream 以用作收集阶段的输入。

关闭它是此类实例的分配器的责任。 关闭它应该清除所有分配的结构,最好删除文件。

Modifier and Type Method and Description
void closeForWriting()
关闭此后备存储以供进一步写入
InputStream getInputStream()
包含分散有效负载的输入流
void writeOut(byte[] data, int offset, int length)
写入一段有效载荷

ScatterGatherBackingStoreSupplier

Modifier and Type Method and Description
ScatterGatherBackingStore get
()
Create a ScatterGatherBackingStore.

FileBasedScatterGatherBackingStore

由文件支持的 ScatterGatherBackingStore

Modifier and Type Method and Description
void close()
void closeForWriting()
关闭此后备存储以供进一步写入
InputStream getInputStream()
包含分散有效负载的输入流
void writeOut(byte[] data, int offset, int length)
写入一段有效载荷

org.apache.commons.compress.utils

ArchiveUtils

Modifier and Type Method and Description
static boolean isArrayZero(byte[] a, int size)
如果数组的前 N 个字节全为零,则返回 true
static boolean isEqual(byte[] buffer1, byte[] buffer2)
static boolean isEqual(byte[] buffer1, byte[] buffer2, boolean ignoreTrailingNulls)
比较字节缓冲区,可选择忽略尾随空值
static boolean isEqual(byte[] buffer1, int offset1, int length1, byte[] buffer2, int offset2, int length2)
static boolean isEqual(byte[] buffer1, int offset1, int length1, byte[] buffer2, int offset2, int length2, boolean ignoreTrailingNulls)
比较字节缓冲区,可选择忽略尾随空值
static boolean isEqualWithNull(byte[] buffer1, int offset1, int length1, byte[] buffer2, int offset2, int length2)
比较字节缓冲区,忽略尾随空值
static boolean matchAsciiBuffer(String expected, byte[] buffer)
检查缓冲区内容是否与 Ascii 字符串匹配
static boolean matchAsciiBuffer(String expected, byte[] buffer, int offset, int length)
检查缓冲区内容是否与 Ascii 字符串匹配。
static String sanitize(String s)
返回作为参数给出的字符串的“净化”版本,其中净化意味着不可打印的字符已被问号替换,结果不超过 255 个字符
static byte[] toAsciiBytes(String inputString)
将字符串转换为 Ascii 字节数组
static String toAsciiString(byte[] inputBytes)
使用 ASCII 字符集将输入字节数组转换为字符串
static String toAsciiString(byte[] inputBytes, int offset, int length)
使用 ASCII 字符集将输入字节数组转换为字符串
static String toString(ArchiveEntry entry)
生成一个包含名称、isDirectory 设置和条目大小的字符串

BitInputStream

从 InputStream 中读取 bits

Modifier and Type Method and Description
void alignWithByteBoundary()
丢弃位,直到从字节边界读取下一位
long bitsAvailable()
返回可以从此输入流中读取的位数的估计值,而不会被下一次调用此输入流的方法阻塞
int bitsCached()
返回可以从此输入流中读取而无需从基础输入流中读取的位数
void clearBitCache()
清除已从基础流中读取但尚未通过 readBits(int) 提供的位缓存
void close()
long getBytesRead()
返回从基础流中读取的字节数
long readBits(int count)
返回从基础流中读取的最多 63 位

BoundedArchiveInputStream

NIO 支持的有界输入流,用于从中读取预定义的数据量。

该类是线程安全的。

Modifier and Type Method and Description
int read()
int read(byte[] b, int off, int len)
protected abstract int read(long pos, ByteBuffer buf)
将流的内容读入 ByteBuffer

BoundedInputStream

一种流,它将从包装流中读取的内容限制为给定的字节数。

Modifier and Type Method and Description
void close()
long getBytesRemaining()
int read()
int read(byte[] b, int off, int len)
long skip(long n)

BoundedSeekableByteChannelInputStream

InputStream 将请求委托给底层的 SeekableByteChannel,确保只能读取特定范围内的字节。

Modifier and Type Method and Description
protected int read(long pos, ByteBuffer buf)
将流的内容读入 ByteBuffer

ByteUtils

Modifier and Type Method and Description
static long fromLittleEndian(byte[] bytes)
将给定的字节数组读取为 little endian long
static long fromLittleEndian(byte[] bytes, int off, int length)
将给定的字节数组读取为 little endian long
static long fromLittleEndian(ByteUtils.ByteSupplier supplier, int length)
从给定的 supplier 读取给定数量的字节作为 little endian long
static long fromLittleEndian(DataInput in, int length)
从给定的输入中读取给定的字节数作为 little endian long.
static long fromLittleEndian(InputStream in, int length)
从给定的流中读取给定的字节数作为 little endian long
static void toLittleEndian(byte[] b, long value, int off, int length)
将给定值作为给定长度的小端序序列插入到数组中,从给定偏移量开始
static void toLittleEndian(ByteUtils.ByteConsumer consumer, long value, int length)
将给定的值作为给定长度的小端序列提供给给定的 consumer
static void toLittleEndian(DataOutput out, long value, int length)
将给定值作为给定长度的小端数组写入给定流
static void toLittleEndian(OutputStream out, long value, int length)
将给定值作为给定长度的小端数组写入给定流

CharsetNames

Java 平台的每个实现都需要字符编码名称。从 Java 标准字符集文档可知:Java 平台的每个实现都需要支持以下字符编码。

  • US-ASCII

七位 ASCII,又名 ISO646-US,又名 Unicode 字符集的基本拉丁语块。

  • ISO-8859-1

ISO 拉丁字母 No. 1,又名 ISO-LATIN-1。

  • UTF-8

八位 Unicode 转换格式。

  • UTF-16BE

十六位 Unicode 转换格式,大端字节序。

  • UTF-16LE

十六位 Unicode 转换格式,little-endian 字节顺序。

  • UTF-16

十六位 Unicode 转换格式,由强制性初始字节顺序标记指定的字节顺序(输入时接受的顺序,输出时使用大端序。)

这也许最好属于 [lang] 项目。即使在 [lang] 中定义了类似的接口,也无法预见 [compress] 将依赖于 [lang]。

Charsets

Java 平台的每个实现都需要字符集。 从 Java 标准字符集文档可知:Java 平台的每个实现都需要支持以下字符编码。

  • US-ASCII

七位 ASCII,又名 ISO646-US,又名 Unicode 字符集的基本拉丁语块。

  • ISO-8859-1

ISO 拉丁字母 No. 1,又名 ISO-LATIN-1。

  • UTF-8

八位 Unicode 转换格式。

  • UTF-16BE

十六位 Unicode 转换格式,大端字节序。

  • UTF-16LE

十六位 Unicode 转换格式,little-endian 字节顺序。

  • UTF-16

十六位 Unicode 转换格式,由强制性初始字节顺序标记指定的字节顺序(输入时接受的顺序,输出时使用大端序。)

这个类最好属于 Commons Lang 或 IO 项目。 即使在另一个 Commons 组件中定义了类似的类,也不能预见 Commons Compress 会依赖于另一个 Commons 组件。

ChecksumCalculatingInputStream

计算读取数据校验和的流。

Modifier and Type Method and Description
long getValue()
Returns the calculated checksum.
int read()
Reads a single byte from the stream
int read(byte[] b)
Reads a byte array from the stream
int read(byte[] b, int off, int len)
Reads from the stream into a byte array.
long skip(long n)

ChecksumVerifyingInputStream

流用完后验证读取数据的校验和的流。

Modifier and Type Method and Description
long getValue()
Returns the calculated checksum.
int read()
Reads a single byte from the stream
int read(byte[] b)
Reads a byte array from the stream
int read(byte[] b, int off, int len)
Reads from the stream into a byte array.
long skip(long n)

CloseShieldFilterInputStream

重新实现 FilterInputStream.close() 什么都不做。

Modifier and Type Method and Description
void close()

CountingInputStream

跟踪读取的字节数的输入流。

该类是非线程安全的。

Modifier and Type Method and Description
protected void count(long read)
增加已读取字节的计数器
long getBytesRead()
返回从此流中读取的当前字节数
int read()
int read(byte[] b)
int read(byte[] b, int off, int len)

CountingOutputStream

跟踪读取的字节数的输出流。

该类是非线程安全的。

Modifier and Type Method and Description
protected void count(long written)
增加已读写出字节的计数器
long getBytesWritten()
返回从此流中写出的当前字节数
void write(byte[] b)
void write(byte[] b, int off, int len)
void write(int b)

CRC32VerifyingInputStream

流用完后验证读取数据的 CRC 的流。

该类是非线程安全的。

FileNameUtils

Modifier and Type Method and Description
static String getBaseName(String filename)
返回文件名的最后一个路径段的基本名称(即直到但不包括最后一个“.”的部分)。
如果它不包含任何点,将返回文件名本身。 文件名参数的所有前导目录都被跳过。
static String getExtension(String filename)
返回扩展名(即最后一个“.”之后的部分)。如果文件名不包含任何点,将返回一个空字符串。 仅查询文件名的最后一段 - 即跳过文件名参数的所有前导目录。

FixedLengthBlockOutputStream

  1. public class FixedLengthBlockOutputStream
  2. extends OutputStream
  3. implements WritableByteChannel

此类支持以固定长度块写入 OutputStream 或 WritableByteChannel。
它可用于支持输出到需要以这种格式输出的设备,例如磁带驱动器。 如果最终块没有足够的内容来填充整个块,则输出将被填充到完整的块大小。

此类可用于支持 TAR、PAX 和 CPIO 阻塞输出到字符特殊设备。 除非写入此类设备,否则不建议使用此类,因为在这种情况下填充没有用处。

此类通常应直接包装 FileOutputStream 或关联的 WritableByteChannel。 如果有一个干预过滤器修改了输出,例如 CompressorOutputStream,或执行其自己的缓冲,例如 BufferedOutputStream,则到设备的输出可能不再具有指定大小。

写入此流的任何内容都应该是自定界的,并且应该容忍为填充最后一个块而添加的任何填充。

Modifier and Type Method and Description
void close()
void flushBlock()
潜在地填充然后将当前块写入底层流
boolean isOpen()
void write(byte[] b, int offset, int length)
int write(ByteBuffer src)
void write(int b)

FlushShieldFilterOutputStream

重新实现 FilterOutputStream.flush() 什么都不做。

Modifier and Type Method and Description
void flush()

IOUtils

这个类是不可变的(具有可变数据,但它是只写的)

Modifier and Type Method and Description
static void closeQuietly(Closeable c)
关闭给定的 Closeable 并静默任何可能发生的 IOException
static void copy(File sourceFile, OutputStream outputStream)
将源文件复制到给定的输出流
static long copy(InputStream input, OutputStream output)
将 InputStream 的内容复制到 OutputStream 中
static long copy(InputStream input, OutputStream output, int buffersize)
将 InputStream 的内容复制到 OutputStream
static long copyRange(InputStream input, long len, OutputStream output)
将 InputStream 的部分内容复制到 OutputStream 中
static long copyRange(InputStream input, long len, OutputStream output, int buffersize)
将 InputStream 的部分内容复制到 OutputStream
static int read(File file, byte[] array)
从文件中读取尽可能多的内容以填充给定的数组
static int readFully(InputStream input, byte[] array)
尽可能多地从输入中读取以填充给定的数组
static int readFully(InputStream input, byte[] array, int offset, int len)
从输入中读取尽可能多的内容,以用给定的字节数填充给定的数组
static void readFully(ReadableByteChannel channel, ByteBuffer b)
从当前通道的位置开始从给定通道读取 b.remaining() 字节
static byte[] readRange(InputStream input, int len)
以 byte[] 形式获取 InputStream 的部分内容
static byte[] readRange(ReadableByteChannel input, int len)
以 byte[] 形式获取 ReadableByteChannel 的部分内容
static long skip(InputStream input, long numToSkip)
如有必要,通过在给定的输入流上重复调用 skip 来跳过给定的字节数
static byte[] toByteArray(InputStream input)
以 byte[] 形式获取 InputStream 的内容

Lists

Modifier and Type Method and Description
static ArrayList newArrayList()
Creates a new ArrayList.
static ArrayList newArrayList(Iterator<? extends E> iterator)
创建一个新的 ArrayList 填充给定迭代器的内容

MultiReadOnlySeekableByteChannel

  1. public class MultiReadOnlySeekableByteChannel
  2. extends Object
  3. implements SeekableByteChannel

连接其他 SeekableByteChannel 集合的 SeekableByteChannel 的只读实现。

这是 Tim Underwood 的 MultiReadOnlySeekableByteChannel 的丢失端口。

Modifier and Type Method and Description
void close()
static SeekableByteChannel forFiles(File… files)
连接给定的文件
static SeekableByteChannel forSeekableByteChannels(SeekableByteChannel… channels)
连接给定的通道
boolean isOpen()
long position()
返回此通道的位置
SeekableByteChannel position(long newPosition)
SeekableByteChannel position(long channelNumber, long relativeOffset)
根据给定的通道号和相对偏移设置位置
int read(ByteBuffer dst)
long size()
SeekableByteChannel truncate(long size)
int write(ByteBuffer src)

OsgiUtils

用于处理 OSGi 环境的工具类。

Modifier and Type Method and Description
static boolean isRunningInOsgiEnvironment()
测试 Commons Compress 是否作为 OSGi 包运行?

SeekableInMemoryByteChannel

  1. public class SeekableInMemoryByteChannel
  2. extends Object
  3. implements SeekableByteChannel

包装 byte[] 的 SeekableByteChannel 实现。

当此通道用于写入时,内部缓冲区会增长以容纳传入数据。 自然大小限制是 Integer.MAX_VALUE 的值,不能将位置或截断设置为大于该值的值。 可以通过 array() 访问内部缓冲区。

Modifier and Type Method and Description
byte[] array()
获取支持此通道的数组
void close()
boolean isOpen()
long position()
返回此通道的位置
SeekableByteChannel position(long newPosition)
int read(ByteBuffer buf)
long size()
返回此通道连接到的实体的当前大小
SeekableByteChannel truncate(long newSize)
将此通道连接到的实体截断为给定大小
int write(ByteBuffer b)

ServiceLoaderIterator

通过标准的 ServiceLoader 机制迭代给定类的所有服务.

Modifier and Type Method and Description
boolean hasNext()
E next()
void remove()

Sets

Modifier and Type Method and Description
static HashSet
newHashSet(E… elements)
创建一个用给定元素填充的新 HashSet

SkipShieldingInputStream

  1. public class SkipShieldingInputStream
  2. extends FilterInputStream

一个重写 skip(long) 并委托给 FilterInputStream.read() 的包装器。

InputStream 的一些实现以某种方式实现 InputStream.skip(long),如果流不可搜索,则抛出异常 - 众所周知,System.in 会以这种方式运行。 对于这样的流,根本不可能调用skip,而您必须从流中读取(并丢弃读取的数据)。 跳过可能比阅读要快得多,因此我们确实希望在可能的情况下调用跳过。 我们提供了此类,因此如果您遇到跳过抛出异常的问题,您可以将自己的 InputStream 包装在其中。

Modifier and Type Method and Description
long skip(long n)