Android之zip文件加密解压及进度条的实现
zip文件的解压能够使用java的zip库,可是没有实现对加密文件的解压功能,这里能够使用zip4j来实现。详细能够參看该文《Android下zip压缩文件加密解密的完美解决方式》。该文件里没有实现解压进度的功能,这里进行一简单的实现。
Zip4jSp.java
/**
* unzip file to dest dir with password in thread.
*
* @param zipFile
* @param dest
* @param passwd
* @param charset
* null or empty is utf-8
* @param Handler
* handler in thread
* @param isDeleteZipFile
* true:delete zip file.false:not.
* @throws ZipException
*/
public static void Unzip(final File zipFile, String dest, String passwd,
String charset, final Handler handler, final boolean isDeleteZipFile)
throws ZipException {
ZipFile zFile = new ZipFile(zipFile);
if (TextUtils.isEmpty(charset)) {
charset = "UTF-8";
}
zFile.setFileNameCharset(charset);
if (!zFile.isValidZipFile()) {
throw new ZipException(
"Compressed files are not illegal, may be damaged.");
}
File destDir = new File(dest); // Unzip directory
if (destDir.isDirectory() && !destDir.exists()) {
destDir.mkdir();
}
if (zFile.isEncrypted()) {
zFile.setPassword(passwd.toCharArray());
} final ProgressMonitor progressMonitor = zFile.getProgressMonitor(); Thread progressThread = new Thread(new Runnable() { @Override
public void run() {
Bundle bundle = null;
Message msg = null;
try {
int percentDone = 0;
// long workCompleted=0;
// handler.sendEmptyMessage(ProgressMonitor.RESULT_SUCCESS)
if (handler == null) {
return;
}
handler.sendEmptyMessage(CompressStatus.START);
while (true) {
Thread.sleep(1000); percentDone = progressMonitor.getPercentDone();
bundle = new Bundle();
bundle.putInt(CompressKeys.PERCENT, percentDone);
msg = new Message();
msg.what = CompressStatus.HANDLING;
msg.setData(bundle);
handler.sendMessage(msg);
if (percentDone >= 100) {
break;
}
}
handler.sendEmptyMessage(CompressStatus.COMPLETED);
} catch (InterruptedException e) {
bundle = new Bundle();
bundle.putString(CompressKeys.ERROR, e.getMessage());
msg = new Message();
msg.what = CompressStatus.ERROR;
msg.setData(bundle);
handler.sendMessage(msg);
e.printStackTrace();
}
finally
{
if(isDeleteZipFile)
{
zipFile.deleteOnExit();//zipFile.delete();
}
}
}
}); progressThread.start();
zFile.setRunInThread(true);
zFile.extractAll(dest);
}
注:
(1)、字符集默认採用UTF-8
(2)、解压文件在线程中进行,所以须要setRunInThread(true).因为採用线程中解压文件,所以调用该函数时相当于异步运行,调用代码会直接往下走,须要注意并加以处理。
(3)、进度条另开了一个线程来处理,并将处理的结果以handler的形式发送
(4)、使用zipFile.deleteOnExit()而不是zipFile.delete();由于使用线程解压时,尽管从progressMonitor获得的percentDone已经达到了100,而其实数据并没有全然解压完毕。这时退出循环执行finally的delete函数,假设使用zipFile.delete(),将会删除文件,这样会使兴许的解压失败。而使用zipFile.deleteOnExit()函数,该函数是当VM终止时才会删除文件,与zipFile.delete()删除文件不同。APP在执行时,VM始终是在的,所以这样删除可以确保兴许的解压可以正常进行。或者不去删除文件。
(5)、handler的代码见后文的MainActivity.java。
CompressKeys.java
package com.sparkle.compress;
public class CompressKeys {
public final static String PERCENT="PERCENT";
public final static String ERROR="ERROR";
}
CompressStatus.java
package com.sparkle.compress;
public class CompressStatus {
public final static int START=0;
public final static int HANDLING=1;
public final static int COMPLETED=2;
public final static int ERROR=3;
}
MainActivity.java
private Handler _handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case CompressStatus.START:
{
setTitle("Start...");
break;
}
case CompressStatus.HANDLING:
{
Bundle bundle=msg.getData();
int percent=bundle.getInt(CompressKeys.PERCENT);
setTitle(percent+"%");
break;
}
case CompressStatus.ERROR:
{
Bundle bundle=msg.getData();
String error=bundle.getString(CompressKeys.ERROR);
_info_textView.setText(error);
break;
}
case CompressStatus.COMPLETED:
{
setTitle("Completed");
byte[] data=FileSp.read(tempFilePath);
try {
String dataStr=new String(data,"UTF-8");
_info_textView.setText(dataStr);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
default:
break;
}
};
};
}
以下是效果图
Android之zip文件加密解压及进度条的实现的更多相关文章
- 「Python实用秘技01」复杂zip文件的解压
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的新系列文章「Python实用秘技」的第1 ...
- linux ubuntu12.04 解压中文zip文件,解压之后乱码
在windows下压缩后的zip包,在ubuntu下解压后显示为乱码问题 1.zip文件解压之后文件名乱码: 第一步 首先安装7zip和convmv(如果之前没有安装的话) 在命令行执行安装命令如下: ...
- php上传zip文件在线解压文件在指定目录下,CI框架版本
我从网上找的文件php在线解压zip压缩文件 文件为jy.php可以直接执行,但是怎样将其加到CI框架中呢?? jy.php文件 <?php header("content-Type: ...
- 如何把zip文件直接解压到内存里?
解压到硬盘再读进来耽误时间. var LZip: TZipFile; LMem: TMemoryStream; LBytes: TBytes;begin LZip := TZipFile.Cr ...
- java实现zip文件的解压
使用到的包 org.apache.commons 下载文件 url:文件所在地址需要是http:// filePath:将下载的文件保存的路径 public static void getDownlo ...
- Android下载压缩文件与解压案例
ackage com.example.jsontest.biz; import java.io.BufferedInputStream; import java.io.BufferedOutputSt ...
- .Net类库 压缩文件 与 Ionic.Zip 批量压缩不同目录文件与解压 文件
using System; using System.IO; using System.IO.Compression; using System.Linq; using System.Text; us ...
- Android 下载zip压缩文件并解压
网上有很多介绍下载文件或者解压zip文件的文章,但是两者结合的不多,在此记录一下下载zip文件并直接解压的方法. 其实也很简单,就是把下载文件和解压zip文件结合到一起.下面即代码: URLConne ...
- Java实现zip压缩文件的解压
需求描述: 前段时间写了一篇博客<Java实现对文本文件MD5加密并ftp传送到远程主机目录>,实现了一部分的业务需求.然而有些业务可能不止传送一个文件,有时候客户需要传多个文件,原有系统 ...
随机推荐
- jquery自动去除form表单中input框前后的空格
1. 2. <script type="text/javascript"> $(document).ready(function() { $('#searchform ...
- sql:MySql create FUNCTION,VIEW,PROCEDURE
use geovindu; #函数 DELIMITER $$ drop function if exists f_GetDepartmentName $$ CREATE function f_GetD ...
- PHP之httpRequest
<?php /** * Respose A Http Request * * @param string $url * @param array $post * @param string $m ...
- drupal 开发笔记
“以前我在开发Java项目的时候,都需要自己设计数据库表结构,数据库表结构的设计关系到一个人开发技能的高低,而在Drupal里面,我们通常是不需要设计数据库表结构,我们要做的是创建新的内容类型,然后为 ...
- 如何使用canvas进行2d绘图
canvas 的 2D context 可以绘制简单的 2D 图形.它的 2D context 坐标开始于 <canvas> 元素的左上角,原点坐标是(0,0).所有的坐标值都基于这个原点 ...
- django开发博客(1) 入门
现在正式开始博客开发 1.安装django1.4 如果你使用的是fedoraDVD版,安装时选择了web开发组建,这一步可以省略,因为它自带django环境 django下载地址 https://ww ...
- Android开发如何定制framework层服务
刚刚跨完年,新年第一篇文章,那么今天将对Android开发framework中间层的服务定制使用作个总结.首先我们先导入Android平台源码framework层的代码到开发工具eclipse中,代码 ...
- Android 弹出框Dialog并缩放图片
java代码 Activity: // 调用dialog,参数:1:自身的activity,2:Bitmap bm读取好的图片 MyDialog dialog = new MyDialog(MyAct ...
- JAVA中获取文件的大小和文件的扩展名
一.获取文件扩展名(该段代码来自博客园网站装男人的博客https://www.cnblogs.com/nanrenzhuang/archive/2013/05/19/6315546.html) pub ...
- java (Eclipse)连接MySQL数据库
package com.ifruit.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql ...