在JAVA中实现7Zip

时间:2010-08-13 07:00:36

标签: java aes 7zip

我已经从7zip网站下载了LZMA SDK但令我失望的是它只支持压缩和解压缩,并且不支持AES加密。有没有人知道在JAVA中是否有完全使用AES加密的7zip实现?感谢。

此致 卡尔。

2 个答案:

答案 0 :(得分:3)

根据7Zip团队:

  

LZMA SDK不支持加密   方法。使用7-Zip源代码   代替。

源代码在汇编程序,C和C ++中可用,您可以从Java调用它们。

答案 1 :(得分:2)

来自apache common-compress文档:

  

请注意,Commons Compress当前仅支持用于7z存档的压缩和加密算法的子集。对于仅写入未压缩的条目,支持LZMA,LZMA2,BZIP2和Deflate-除了那些读取支持AES-256 / SHA-256和DEFLATE64。

如果您使用common-compress,则由于不必嵌入任何本机库,因此可能不会出现代码可移植性问题。

下面的代码显示如何遍历7zip归档文件中的文件并将其内容打印到stdout。您可以根据AES要求对其进行调整:

public static void showContent(String archiveFilename) throws IOException {

    if (archiveFilename == null) {
        return;
    }

    try (SevenZFile sevenZFile = new SevenZFile(new File(archiveFilename))) {
        SevenZArchiveEntry entry = sevenZFile.getNextEntry();
        while (entry != null) {
                final byte[] contents = new byte[(int) entry.getSize()];
                int off = 0;
                while ((off < contents.length)) {
                    final int bytesRead = sevenZFile.read(contents, off, contents.length - off);
                    off += bytesRead;
                }
                System.out.println(new String(contents, "UTF-8"));              
            entry = sevenZFile.getNextEntry();
        }
    }
}

使用的进口:

import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
import org.apache.commons.compress.archivers.sevenz.SevenZFile;

使用的Maven依赖项:

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-compress</artifactId>
        <version>1.18</version>
    </dependency>
    <dependency>
        <groupId>org.tukaani</groupId>
        <artifactId>xz</artifactId>
        <version>1.6</version>
    </dependency>

请注意:org.tukaani:xz仅对于7zip是必需的。 common-compress依赖性在其他受支持的压缩格式中不需要。