【问题标题】:Preview .7z content and subfolders without extracting无需解压即可预览 .7z 内容和子文件夹
【发布时间】:2016-01-19 06:17:21
【问题描述】:

我想在不使用 Java 提取的情况下预览 .7z 的内容,所以我尝试使用 Apache Commons Compress:

public static void main(String[] args) {
    try {
        SevenZFile sevenZFile = new SevenZFile(new File("C://test.7z"));
        SevenZArchiveEntry entry;
        while ((entry = sevenZFile.getNextEntry()) != null) {
            System.out.println("Name: " + entry.getName());
            System.out.println("Size : " + entry.getSize());
            System.out.println("--------------------------------");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

它可以工作,但我还想将文件预览到其他 7z 或原始 7z 的 zip 中:

test.7z
--- file1.txt
--- otherInner.7z
    ---- innerFile1.txt
    ---- innerFile2.txt

有没有办法在不提取 7z 的情况下做到这一点? 感谢您的帮助。

【问题讨论】:

  • 我不确定,但我认为这应该是不可能的,因为由于 sub 7zip 文件是压缩的,所以 7zip 需要解压缩它来分析里面的内容。
  • 这也是我的意见,但我不确定...感谢您的回答

标签: java 7zip apache-commons-compress


【解决方案1】:

有点。你的意思是不提取外部7z?是的。不提取内部7z?没有。

看起来 Apache Commons SevenZ 仅适用于 File 对象,因此您至少必须提取内部 7z 文件才能对其进行解码。

一旦你有了你想要的entry,你就可以从字节数组中读取那个条目的字节。然后,您可以将这些字节写入(临时)文件,然后创建一个新的 SevenZFile 对象来解析它..

这段代码大部分取自Apache Common Compress Examples page

SevenZFile sevenZFile =...
SevenZArchiveEntry entry...

...found our entry we want...
byte[] content = new byte[entry.getSize()];
LOOP UNTIL entry.getSize() HAS BEEN READ {
    sevenZFile.read(content, offset, content.length - offset);
}

现在我们已经将压缩字节存储在byte[] 中,我们必须将其写入一个文件,然后我们可以使用另一个 SeventZFile 实例解压缩它。

您可能可以跳过中间字节[],而是直接读取和写入临时文件,但无论哪种方式,您都必须在某个地方创建一个临时文件。

【讨论】:

  • 是的,dkatzel,它没有提取外部和内部 7z...感谢您的详细回答
猜你喜欢
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多