如何在 Android 中以编程方式解压缩文件?
我需要一个小代码片段,它从给定的 .zip 文件中解压缩一些文件,并根据压缩文件中的格式提供单独的文件。请发布您的知识并帮助我。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我需要一个小代码片段,它从给定的 .zip 文件中解压缩一些文件,并根据压缩文件中的格式提供单独的文件。请发布您的知识并帮助我。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(17)
peno 的版本优化了一点。性能的提升是显而易见的。
Had peno's version optimised a bit. The increase in performance is perceptible.
根据瓦西里·索钦斯基(Vasily Sochinsky)的回答进行了一些调整&有一个小修复:
显着差异
public static
- 这是一个可以在任何地方的静态实用方法。File
参数,因为String
对于文件来说是 :/ 并且之前无法指定 zip 文件的解压位置。还有路径+文件名
串联> https://stackoverflow.com/a/412495/995891抛出
- 因为catch Late - 如果真的对它们不感兴趣,请添加一个 try catch。mkdirs()
的返回值很重要。finally
的魔力来防止资源泄漏。所以
应该做相当于原来的事情
Based on Vasily Sochinsky's answer a bit tweaked & with a small fix:
Notable differences
public static
- this is a static utility method that can be anywhere.File
parameters becauseString
are :/ for files and one could not specify where the zip file is to be extracted before. Alsopath + filename
concatenation > https://stackoverflow.com/a/412495/995891throws
- because catch late - add a try catch if really not interested in them.mkdirs()
is important.finally
to prevent resource leaks.So
should do the equivalent of the original
这是我的解压缩方法,我使用:
This is my unzip method, which I use:
Kotlin 方式
用法
The Kotlin way
Usage
Android 具有内置的 Java API。查看 java.util.zip 包。
ZipInputStream 类是您应该研究的内容。从 ZipInputStream 读取 ZipEntry 并将其转储到文件系统/文件夹中。检查类似示例以压缩为zip文件。
Android has build-in Java API. Check out java.util.zip package.
The class ZipInputStream is what you should look into. Read ZipEntry from the ZipInputStream and dump it into filesystem/folder. Check similar example to compress into zip file.
使用以下类
如何使用
权限
use the following class
How to use
Permissions
虽然这里已经有了答案,效果很好,但我发现它们比我希望的要慢一些。相反,我使用了 zip4j,我认为这是最好的解决方案,因为它的速度。它还允许对压缩量进行不同的选择,我发现这很有用。
While the answers that are already here work well, I found that they were slightly slower than I had hoped for. Instead I used zip4j, which I think is the best solution because of its speed. It also allowed for different options for the amount of compression, which I found useful.
根据@zapl的回答,解压并附上进度报告:
According to @zapl answer,Unzip with progress report:
->Helper 类(Unzipper.java)
->xml 布局(activity_main.xml):
->Menifest 文件中的权限:
->Helper Class(Unzipper.java)
->xml layout(activity_main.xml):
->permission in Menifest file:
这是一个 ZipFileIterator(类似于 java Iterator,但用于 zip 文件):
Here is a ZipFileIterator (like a java Iterator, but for zip files):
我曾经将 zip 文件中的特定文件解压缩到应用程序缓存文件夹中的最小示例。然后我使用不同的方法读取清单文件。
Minimal example I used to unzip a specific file from my zipfile into my applications cache folder. I then read the manifest file using a different method.
我正在处理 Java 的 ZipFile 类无法处理的 zip 文件。 Java 8 显然无法处理压缩方法 12(我相信是 bzip2)。在尝试了包括 zip4j 在内的多种方法(由于另一个问题,这些特定文件也失败了)之后,我成功使用了支持 Apache 的 commons-compress。 apache.org/proper/commons-compress/zip.html#encryption" rel="nofollow noreferrer">此处提到的其他压缩方法。
请注意,下面的 ZipFile 类不是来自 java.util.zip 的类。
它实际上是 org.apache.commons.compress.archivers.zip.ZipFile 所以要小心进口。
对于摇篮:
I'm working with zip files which Java's ZipFile class isn't able to handle. Java 8 apparently can't handle compression method 12 (bzip2 I believe). After trying a number of methods including zip4j (which also fails with these particular files due to another issue), I had success with Apache's commons-compress which supports additional compression methods as mentioned here.
Note that the ZipFile class below is not the one from java.util.zip.
It's actually org.apache.commons.compress.archivers.zip.ZipFile so be careful with the imports.
For Gradle:
根据 zapl 的回答,在
Closeable
周围添加try()
会在使用后自动关闭流。使用从
C# .NET 4
获取的Constant.DefaultBufferSize
(65536
) Stream.CopyTo 来自 Jon Skeet 的回答:https://stackoverflow.com/a/411605/1876355
我总是只看到使用
byte[1024] 的帖子
或byte[4096]
缓冲区,从来不知道它可以更大,从而提高性能并且仍然完全正常工作。这是
Stream
源代码:https://referencesource.microsoft.com/#mscorlib/system/io/流.cs
不过,为了安全起见,我将其拨回到
65536
,它也是4096
的倍数。Based on zapl's answer, adding
try()
aroundCloseable
's closes the streams automatically after use.Using
Constant.DefaultBufferSize
(65536
) gotten fromC# .NET 4
Stream.CopyTo from Jon Skeet's answer here:https://stackoverflow.com/a/411605/1876355
I always just see posts using
byte[1024]
orbyte[4096]
buffer, never knew it can be much larger which improves performance and is still working perfectly normal.Here is the
Stream
Source code:https://referencesource.microsoft.com/#mscorlib/system/io/stream.cs
However, I dialed it back to
65536
which is also a multiple of4096
just to be safe.密码保护的Zip文件
如果你想用密码压缩文件,你可以看看这个库可以轻松地使用密码压缩文件:
Zip:
Unzip:
Rar:
这个库的文档足够好,我只是从那里添加了一些示例。
它是完全免费的,并且是专门为 Android 编写的。
Password Protected Zip File
if you want to compress files with password you can take a look at this library that can zip files with password easily:
Zip:
Unzip:
Rar:
The documentation of this library is good enough, I just added a few examples from there.
It's totally free and wrote specially for android.
这是 @arsent 解决方案的更简洁版本:
Here is more concise version of @arsent solution:
在 Kotlin 中,这个函数会很有帮助:
如果这个路径是内部存储,则不需要任何权限。
例如
,添加读/写外部存储的权限。
In Kotlin, this Function can be helpful :
if this path is a internal storage, don't need any permission.
For example
otherwise add permission for read/write external storage.
对于 Kotlin 中的 Zip 和解压缩文件,请使用此
邮政编码解压
我为此找到的文档 Doc
您可以更新代码,添加缓冲区以减少解压时间。
For Zip and Unzip files in Kotlin, use this
Zip & Unzip
The Documentation i found for this Doc
You can update the code with adding buffer for reducing unzipping time.