Android 上的 J7zip - 从存档中提取并列出内容

Posted

技术标签:

【中文标题】Android 上的 J7zip - 从存档中提取并列出内容【英文标题】:J7zip on Android - Extracting From an Archive and Listing Contents 【发布时间】:2012-12-24 19:04:36 【问题描述】:

我之前的问题因为没有建设性而被关闭。我在那里编辑了它,但没有看到它已关闭):

我正在编写一个涉及提取 7z 档案的应用程序。似乎没有任何原生支持,所以我冒险寻找可以集成到我的项目中的第三方库或源代码。

我一直在尝试实现J7zip,但没有成功。

列出存档的内容不返回任何文件:

12-24 13:36:44.216: I/System.out(18473): J7zip 4.43 ALPHA 2 (2 CPUs)
12-24 13:36:44.232: I/System.out(18473):   Date   Time   Attr         Size   Compressed  Name
12-24 13:36:44.232: I/System.out(18473): -------------- ----- ------------ ------------  ------------
12-24 13:36:44.240: I/System.out(18473): -------------- ----- ------------ ------------  ------------

但是,在 windows 上列出内容(使用 7z.exe)会返回以下内容

7-Zip 9.22 beta  Copyright (c) 1999-2011 Igor Pavlov  2011-04-18

Listing archive: archive.7z

--
Path = archive.7z
Type = 7z
Method = LZMA
Solid = -
Blocks = 1
Physical Size = 183119
Headers Size = 122

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
                    .....       524288       182997  contents.txt
------------------- ----- ------------ ------------  ------------------------
                                524288       182997  1 files, 0 folders

提取失败,我有那个 here 的 logcat,因为它有点长。

这里似乎存在 io 问题,但我怀疑还有其他问题,因为列出此存档不会返回任何文件。

有人有使用 J7zip 提取和列出存档内容的经验吗?

【问题讨论】:

我已经解决了这个问题。我很快就会写一个解释(: 【参考方案1】:

这里有几个可能的解决方案。

我首先尝试交叉编译 7zip jbinding 项目。我将 armeabi c 和 c++ 编译器安装到我的机器上并尝试构建项目。不幸的是,我无法构建可用于 android 项目的二进制文件。我在论坛帖子中提到了尝试将已编译的 jbinding 二进制文件加载回导致问题的库。

我的下一个领导是实现 p7z 的 java 端口,J7zip (http://sourceforge.net/projects/p7zip/files/J7Zip/)。实现这一点并不算太糟糕,除了我必须修改 j7z 库尝试写入 SD 卡根目录的代码(没有根访问权限)。此端口在大多数情况下运行良好,但在提取较大的档案或包含许多类似文件的档案时会导致内存不足错误。问题是库试图为字典分配太多内存(即使您只想提取一个文件,它也会分配所有提取内容的大小)。所以这个库在我的情况下不起作用,我认为它不支持你正在使用的压缩。

最后,我发现了这个看似已死的 Google 代码项目,名为 andro7z (http://code.google.com/p/andro7z/)。这段代码包含一个 7zip 版本和一个非常非常基本的 JNI 实现。当您第一次获取源时,它所能做的就是打印使用,但它为您提供了一个很好的起点。我最终研究并修改了它,这样我就可以返回一个字符串数组,其中包含存档中包含的文件的名称,以及从存档中提取特定或所有文件。因为我只使用 7z 文件,所以我没有让它成为一个非常优雅的实现,但它确实有效。使用实际的 7zip c/cpp 源意味着输出流得到正确处理,并且不会尝试分配过分的字典大小。

要编译 andro7z,如果您还没有 android NDK,则需要获取它。从那里您将不得不编写自己的 JNI 方法,以便您可以使用 Java 与本机二进制文件进行交互。您会在 7za.cpp 的顶部看到一些测试参数,您可以取消注释并测试硬编码提取。

【讨论】:

我正在尝试使用 andro7z 列出 7z 内容,但没有成功。你能把你的代码上传到某个地方吗?非常感谢 code.google.com/p/andro7z此链接已不存在

以上是关于Android 上的 J7zip - 从存档中提取并列出内容的主要内容,如果未能解决你的问题,请参考以下文章

从python中的tar存档中提取压缩的gz文件

从 zip 存档中提取单个文件

从存档中提取精确文件的快速方法

快速从存档中提取所选文件

使用 Perl 从巨大的存档中提取单个

从控制台存档的 TARBall 中提取文件