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

标签 java android 7zip

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

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

我一直在尝试实现 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 的日志因为它有点长。

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

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

最佳答案

这里有一些可能的解决方案。

我首先尝试交叉编译 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 与 native 二进制文件进行交互。您会在 7za.cpp 的顶部看到一些测试参数,您将能够取消注释这些参数并测试硬编码提取。

关于java - Android 上的 J7zip - 从存档中提取并列出内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14024874/

相关文章:

java - 将 Jackson 添加到 POM 会导致 JsonProcessingException 出现 NoClassDefError

android - SyncAdapter 与 JobScheduler

Android:尝试用 View 替换键盘时如何防止 View 跳转/闪烁

Java: `A` 以编程方式创建 zip 时缺少存档属性

batch-file - 如何在cmd中显示7zip的提取进度?

java - 如何使用 Spring JPA Data 获取 NumberExpression<Integer> 结果?

java - 如何使用 ZonedDateTime 将 UTC 时间转换为 LocalDateTime

android - Youtube Android Player会降低设备速度

c# - SevenZipSharp - 如何使用 C# 将多个目录压缩到一个文件中?

java - 如何在java中获取当前日期(仅日期格式)并将其保存在Notes文档中