Android中zip,tar.gz压缩与解压缩
2016-06-27 13:17
447 查看
项目中有这样的需求,在导出的时候需要导出压缩包,导入的时候需要解压缩包。网上看到不少代码都有不少缺陷,要不zip不支持中文,要不不支持压缩到任意目录,修改了下发上了。亲测亲改可用。
需要两个jar包,一个ZipEntry.jar让zip压缩支持中文
一个commons-compress-1.5是tar和gz支持的包
一起打包提供下载地址 压缩jar包
后面的tar.gz实际是先打了tar包然后做的gz压缩,所以单独的tar包或者gz压缩解压缩,去掉一部分代码即可
需要两个jar包,一个ZipEntry.jar让zip压缩支持中文
一个commons-compress-1.5是tar和gz支持的包
一起打包提供下载地址 压缩jar包
后面的tar.gz实际是先打了tar包然后做的gz压缩,所以单独的tar包或者gz压缩解压缩,去掉一部分代码即可
/** * 递归zip压缩一个文件夹中所有的文件 * zip压缩 */ private static void compress(File file, com.file.zip.ZipOutputStream out, String basedir) { /* 判断是目录还是文件 */ if (file.isDirectory()) { compressDirectory(file, out, basedir); } else { compressFile(file, out, basedir); } } /** 压缩一个目录 */ private static void compressDirectory(File dir, com.file.zip.ZipOutputStream out, String basedir) { if (!dir.exists()) return; File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { compress(files[i], out, basedir + dir.getName() + "/"); } } /** 压缩一个文件 */ private static void compressFile(File file, com.file.zip.ZipOutputStream out, String basedir) { if (!file.exists()) { return; } try { BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); com.file.zip.ZipEntry entry = new com.file.zip.ZipEntry(basedir + file.getName()); out.putNextEntry(entry); int count; byte data[] = new byte[1024]; while ((count = bis.read(data)) != -1) { out.write(data, 0, count); } bis.close(); } catch (Exception e) { throw new RuntimeException(e); } } public static void zip(String srcPathName, String zipFileName) { File file = new File(srcPathName); File zipFile = new File(zipFileName); if (!file.exists()) throw new RuntimeException(srcPathName + "不存在!"); try { FileOutputStream fileOutputStream = new FileOutputStream(zipFile); CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32()); com.file.zip.ZipOutputStream out = new com.file.zip.ZipOutputStream(cos); out.setEncoding(System.getProperty("sun.jnu.encoding"));//设置文件名编码方式 String basedir = ""; compress(file, out, basedir); out.close(); } catch (Exception e) { throw new RuntimeException(e); } }
/** * 解压缩zip工具类 * @param file 压缩文件 * @param dir 解压缩*目录* * @throws IOException */ public static void unzip(File file, String dir) throws IOException { //建立目标目录 File parent = new File(dir); if (!parent.exists()){ parent.mkdirs(); } ZipFile zipFile = new ZipFile(file, "GBK");//设置压缩文件的编码方式为GBK Enumeration<ZipEntry> entris = zipFile.getEntries(); ZipEntry zipEntry = null; File tmpFile = null; BufferedOutputStream bos = null; InputStream is = null; byte[] buf = new byte[1024]; int len = 0; while (entris.hasMoreElements()) { zipEntry = entris.nextElement(); tmpFile = new File(dir + zipEntry.getName()); File father = new File(tmpFile.getParent()); if (!father.exists()){ father.mkdirs(); } if (zipEntry.isDirectory()) {//当前文件为目录 if (!tmpFile.exists()) { tmpFile.mkdir(); } } else { if (!tmpFile.exists()) { tmpFile.createNewFile(); 4000 } is = zipFile.getInputStream(zipEntry); bos = new BufferedOutputStream(new FileOutputStream(tmpFile)); while ((len = is.read(buf)) > 0) { bos.write(buf, 0, len); } bos.flush(); bos.close(); } }
/** * 压缩tar.gz包 * @param files 文件 * @param destPath 目的路径 */ public void doTarGZ(File[] files, String destPath) throws IOException { /* * 定义一个TarArchiveOutputStream 对象 */ File tarFile = new File(destPath); FileOutputStream fos = new FileOutputStream(tarFile); BufferedOutputStream bos = new BufferedOutputStream(fos); TarArchiveOutputStream taos = new TarArchiveOutputStream(bos); byte[] buf = new byte[1024]; for (File child : files) { if (child.isFile()) { // 文件 FileInputStream fis = new FileInputStream(child); BufferedInputStream bis = new BufferedInputStream(fis); TarArchiveEntry tae = new TarArchiveEntry(child.getName()); tae.setSize(child.length()); taos.putArchiveEntry(tae); int len; while ((len = bis.read(buf)) > 0) { taos.write(buf, 0, len); } bis.close(); taos.flush(); taos.closeArchiveEntry(); continue; } } //建立压缩文件输出流 FileOutputStream gzFile = new FileOutputStream(destPath + ".gz"); //建立gzip压缩输出流 GZIPOutputStream gzout = new GZIPOutputStream(gzFile); //打开需压缩文件作为文件输入流 File file = new File(destPath); FileInputStream tarin = new FileInputStream(file); int len; while ((len = tarin.read(buf)) != -1) { gzout.write(buf, 0, len); } gzout.close(); gzFile.close(); tarin.close(); //删除tar包保留tar.gz file.delete(); }
/** *tar.gz解压缩 */ public static void doUnTarGz(File srcfile, String destpath) throws IOException { byte[] buf = new byte[1024]; FileInputStream fis = new FileInputStream(srcfile); BufferedInputStream bis = new BufferedInputStream(fis); GzipCompressorInputStream cis = new GzipCompressorInputStream(bis); TarArchiveInputStream tais = new TarArchiveInputStream(cis); TarArchiveEntry tae = null; int pro = 0; while ((tae = tais.getNextTarEntry()) != null) { File f = new File(destpath + "/" + tae.getName()); if (tae.isDirectory()) { f.mkdirs(); } else { /* * 父目录不存在则创建 */ File parent = f.getParentFile(); if (!parent.exists()) { parent.mkdirs(); } FileOutputStream fos = new FileOutputStream(f); BufferedOutputStream bos = new BufferedOutputStream(fos); int len; while ((len = tais.read(buf)) != -1) { bos.write(buf, 0, len); } bos.flush(); bos.close(); } } tais.close(); }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories