【文件压缩】 Android Jar、Zip文件压缩和解压缩处理
来源:互联网 发布:数据库的查询分析器 编辑:程序博客网 时间:2024/06/05 14:40
★ java的zip工具包(java.util.zip)
参考代码:
package com.zlf.jarzip;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.util.jar.JarEntry;import java.util.jar.JarInputStream;import java.util.jar.JarOutputStream;import java.util.zip.ZipEntry;import java.util.zip.ZipInputStream;import java.util.zip.ZipOutputStream;import android.os.Bundle;import android.view.View;import android.widget.Toast;import android.app.Activity;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void onClick_Jar_Compress(View view) {try {// 使用FileOutputStream对象指定一个要输出的压缩文件(file.jar)FileOutputStream fos = new FileOutputStream(android.os.Environment.getExternalStorageDirectory()+ "/file.jar");// 第一步:创建JarOutputStream对象JarOutputStream jar = new JarOutputStream(fos);// 第二步:创建一个JarEntry对象,并指定待压缩文件在压缩包中的文件名JarEntry jarEntry = new JarEntry("jarjar.xml");// 第三步:使用putNextEntry方法打开当前的JarEntry对象jar.putNextEntry(jarEntry);InputStream is = getResources().getAssets().open("strings.xml");byte[] buffer = new byte[8192];int count = 0;// 第四步:写入数据while ((count = is.read(buffer)) >= 0) {jar.write(buffer, 0, count);}is.close();// 第五步:关闭当前的jarEntry对象jar.closeEntry();jar.close();Toast.makeText(this, "成功将strings.xml文件以jar格式压缩", Toast.LENGTH_SHORT).show();} catch (Exception e) {Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();}}public void onClick_Jar_Uncompress(View view) {try {// 定义要解压的文件String fileName = android.os.Environment.getExternalStorageDirectory() + "/file.jar";if (!new File(fileName).exists()) {Toast.makeText(this, "压缩文件不存在", Toast.LENGTH_SHORT).show();return;}// 使用FileInputStream对象指定要解压的文件FileInputStream fis = new FileInputStream(fileName);// 第一步:创建JarInputStream对象来读取压缩文件file.jarJarInputStream jis = new JarInputStream(fis);// 第二步:调用getNextJarEntry方法打开压缩包中的第一个文件(如果有多个压缩包,可多次调用该方法)JarEntry jarEntry = jis.getNextJarEntry();// 输出已解压的文件FileOutputStream fos = new FileOutputStream(android.os.Environment.getExternalStorageDirectory() + "/"+ jarEntry.getName());byte[] buffer = new byte[8192];int count = 0;while ((count = jis.read()) >= 0) {fos.write(buffer, 0, count);}jis.closeEntry();jis.close();fos.close();Toast.makeText(this, "成功解压jar格式文件", Toast.LENGTH_SHORT).show();} catch (Exception e) {Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();}}public void onClick_Zip_Compress(View view) {try {// 指定了两个待压缩的文件,都在assets目录中String[] filenames = new String[] { "activity_main.xml","strings.xml" };FileOutputStream fos = new FileOutputStream(android.os.Environment.getExternalStorageDirectory()+ "/file.zip");ZipOutputStream zos = new ZipOutputStream(fos);int i = 1;// 枚举filenames中的所有待压缩文件while (i <= filenames.length) {// 从filenames数组中取出当前待压缩的文件名,作为压缩后的名称,以保证压缩前后文件名一致ZipEntry zipEntry = new ZipEntry(filenames[i - 1]);// 打开当前的zipEntry对象zos.putNextEntry(zipEntry);InputStream is = getResources().getAssets().open(filenames[i - 1]);byte[] buffer = new byte[8192];int count = 0;// 写入数据while ((count = is.read(buffer)) >= 0) {zos.write(buffer, 0, count);}zos.flush();zos.closeEntry();is.close();i++;}zos.finish();zos.close();Toast.makeText(this, "成功将activity_main.xml、strings.xml文件以zip格式压缩.",Toast.LENGTH_LONG).show();} catch (Exception e) {Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();}}public void onClick_Zip_Uncompress(View view) {try {// 指定待解压的文件String filename = android.os.Environment.getExternalStorageDirectory() + "/file.zip";if (!new File(filename).exists()) {Toast.makeText(this, "压缩文件不存在.", Toast.LENGTH_LONG).show();return;}FileInputStream fis = new FileInputStream(filename);ZipInputStream zis = new ZipInputStream(fis);ZipEntry zipEntry = null;// 通过不断调用getNextEntry方法来解压file.zip中的所有文件while ((zipEntry = zis.getNextEntry()) != null) {FileOutputStream fos = new FileOutputStream(android.os.Environment.getExternalStorageDirectory()+ "/" + zipEntry.getName());byte[] buffer = new byte[8192];int count = 0;while ((count = zis.read(buffer)) >= 0) {fos.write(buffer, 0, count);}zis.closeEntry();fos.close();}zis.close();Toast.makeText(this, "成功解压jar格式的文件.", Toast.LENGTH_LONG).show();} catch (Exception e) {Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();}}}
需要添加系统权限:
<!-- 在SDCard中创建与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 往SDCard写入数据权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
★ Base64 编码
android.util.Base64.encode(byte[] input, int flags)使用问题:
flags使用Base64.DEFAULT时,会默认自动添加换行符等符号,使用NO_WRAP可以去掉换行符,故与服务器传输文件时,前后端处理时需保持一致!
1. CRLF 这个参数看起来比较眼熟,它就是Win风格的换行符,意思就是使用CR LF这一对作为一行的结尾而不是Unix风格的LF;
2. 这个参数是默认,使用默认的方法来加密;
3. NO_PADDING 这个参数是略去加密字符串最后的”=”;
4. NO_WRAP 这个参数意思是略去所有的换行符(设置后CRLF就没用了);
5. URL_SAFE 这个参数意思是加密时不使用对URL和文件名有特殊意义的字符来作为加密字符,具体就是以-和_取代+和/。
★ Apache的zip工具包(ant.jar)
使用java的zip包可以进行简单的文件压缩和解压缩处理时,但是遇到包含中文汉字目录或者包含多层子目录的复杂目录结构时,容易出现各种各样的问题。
对于这种情况, 可以使用apache的zip工具包(所在包为ant.jar )代替JDK的zip工具包,因为java类型自带的不支持中文路径,不过两者使用的方式是一样的,只是apache压缩工具多了设置编码方式的接口,其他基本上是一样的。
Apache的ant.jar包下载地址:http://download.csdn.net/detail/wenbitianxiafeng/8946477
参考解压缩源码如下:
/** * 使用Apache工具包解压缩zip文件 * @param sourceFilePath 指定的解压缩文件地址 * @param targetDirPath 指定的解压缩目录地址 * @throws IOException * @throws FileNotFoundException * @throws ZipException */public static void uncompressFile(String sourceFilePath, String targetDirPath)throws IOException, FileNotFoundException, ZipException{ BufferedInputStream bis; ZipFile zf = new ZipFile(sourceFilePath, "GBK"); Enumeration e = zf.getEntries(); while (e.hasMoreElements()){ org.apache.tools.zip.ZipEntry ze = (org.apache.tools.zip.ZipEntry) e.nextElement(); String entryName = ze.getName(); String path = targetDirPath + "/" + entryName; if (ze.isDirectory()){ System.out.println("正在创建解压目录 - " + entryName); File decompressDirFile = new File(path); if (!decompressDirFile.exists()){ decompressDirFile.mkdirs(); } } else{ System.out.println("正在创建解压文件 - " + entryName); String fileDir = path.substring(0, path.lastIndexOf("/")); File fileDirFile = new File(fileDir); if (!fileDirFile.exists()){ fileDirFile.mkdirs(); } BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetDirPath + "/" + entryName)); bis = new BufferedInputStream(zf.getInputStream(ze)); byte[] readContent = new byte[1024]; int readCount = bis.read(readContent); while (readCount != -1){ bos.write(readContent, 0, readCount); readCount = bis.read(readContent); } bos.close(); } } zf.close(); }
★ Android Assets文件写入SD卡
参考代码如下:
/** * 复制assets目录下指定文件到sd卡中 * @param mContext * @param path */public static void deepFile(Context mContext, String path) { try { String str[] = mContext.getAssets().list(path); if (str.length > 0) { File file = new File(Environment.getExternalStorageDirectory().getPath(), path); file.mkdirs(); for (String string : str) { path = path + "/" + string; deepFile(mContext, path); path = path.substring(0, path.lastIndexOf('/')); } } else { InputStream is = mContext.getAssets().open(path); File subFile = new File(Environment.getExternalStorageDirectory().getPath(), path); if (!subFile.exists()) {subFile.createNewFile();} FileOutputStream fos = new FileOutputStream(subFile); byte[] buffer = new byte[1024]; while (true) { int len = is.read(buffer); if (len == -1) { break; } fos.write(buffer, 0, len); } is.close(); fos.close(); } } catch (IOException e) { e.printStackTrace(); } }
补充:
基于字节流的形式传输文件:http://www.cnblogs.com/greatverve/archive/2011/12/23/android-upload.html
0 0
- 【文件压缩】 Android Jar、Zip文件压缩和解压缩处理
- 压缩和解压缩ZIP文件
- java压缩和解压缩Zip、Jar、Gzip文件
- java压缩和解压缩Zip、Jar、Gzip文件
- java压缩和解压缩Zip、Jar、Gzip文件
- java压缩和解压缩Zip、Jar、Gzip文件
- java压缩和解压缩Zip、Jar、Gzip文件
- java压缩和解压缩Zip、Jar、Gzip文件
- java压缩和解压缩Zip、Jar、Gzip文件
- java压缩和解压缩Zip、Jar、Gzip文件
- apach ant 压缩和解压缩zip文件
- python怎样压缩和解压缩ZIP文件
- python怎样压缩和解压缩ZIP文件
- Java zip/gzip文件压缩和解压缩
- Java zip/gzip文件压缩和解压缩
- 文件压缩和解压缩
- 使用ant实现Zip文件压缩和解压缩Zip文件
- java zip单文件或多文件 压缩和解压缩
- 进程与端口映射
- std::nothrow
- 克鲁斯卡尔算法求解最小生成树
- Java定时任务
- C++ 内存详解(二)
- 【文件压缩】 Android Jar、Zip文件压缩和解压缩处理
- 删除重复代码--提升代码质量
- AspNet MVC4 教学-19:Asp.Net MVC4 利用Linq技术的搜索应用快速Demo
- Hibernate继承映射
- 回归预测及R语言实现 Part2 回归R语言实现
- 七牛的ufop应用场景介绍
- 工作经历0
- leetcode Symmetric Tree
- 过 DNF TP 驱动保护(一)