JAVAIO之压缩流(zip,Gzip)
来源:互联网 发布:海洋cms仿迅影网模板 编辑:程序博客网 时间:2024/06/06 00:51
JAVAIO之压缩流(zip,Gzip)
JAVAIO流是java的一个很重要的部分,清晰有很复杂,各种各样的流分管不同的功能。正确使用IO流可以让你的输入输出效率增加,这篇博客主要说一下压缩流的使用,使用JAVA内置API压缩解压缩文件。
1.ZIP压缩
主要的用到的API是
ZipFile ZipInputStream ZipOutputStream
直接贴完整代码,都有注释
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.Closeable;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipException;import java.util.zip.ZipFile;import java.util.zip.ZipInputStream;import java.util.zip.ZipOutputStream;/** * * @author chendong * * </br>使用java内置APIZipFile完成对文件的压缩解压缩操作 * * </br>文件中如果有中文名称加压后的文件会出现乱码,但是解压之后又ok了,可以使用中文 * * </br>提供了大文件异步加压解压的方法,使用回调检测是否完成 * * </br>提供小文件同步加压解压更加方便 * */public class ZipUtils { /** * 用于大文件加压解压的回调监听 * * @author chendong * */ public interface OnZipOverListener { void onZipOver(); } public interface OnUnZipOverListener { void onUnZipOver(); } /** * 压缩 </br>构造源文件 * * @param src * 源文件路径 * @param dest * 目标文件路径 * @throws FileNotFoundException */ public static void zip(String src, String dest, OnZipOverListener listener) { File srcFile = new File(src); zip(srcFile, dest, listener); } /** * 压缩 </br>生成压缩输出文件流 * * @param srcFile * @param dest * @throws FileNotFoundException */ public static void zip(File srcFile, String dest, OnZipOverListener listener) { ZipOutputStream destOs = null; try { destOs = new ZipOutputStream(new FileOutputStream(dest)); zip(srcFile, destOs, ""); close(destOs); if (listener != null) listener.onZipOver(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { close(destOs); } } /** * 压缩,使用递归 </br>写文件 </br>主要操作在这个函数中,使用递归如果是一个文件,将其写入流中否则进行递归 </br>ZipEntry * 类是java.util.zip包下的一个类, ZipEntry 类用于表示 ZIP 文件条目。 利用这个类压缩和解压zip文件 * * @param srcFile * @param destOs * @param string * @throws IOException */ private static void zip(File srcFile, ZipOutputStream destOs, String base) { BufferedInputStream bis = null; try { if (srcFile.isDirectory()) { /* 如果源文件是目录 */ File[] files = srcFile.listFiles(); destOs.putNextEntry(new ZipEntry(base + "/")); base = base.length() == 0 ? "" : base + "/"; for (int i = 0; i < files.length; i++) { zip(files[i], destOs, base + files[i].getName()); } } else { /* 如果是文件 */ destOs.putNextEntry(new ZipEntry(base)); bis = new BufferedInputStream(new FileInputStream(srcFile)); byte[] buffer = new byte[1024]; int len = 0; while ((len = bis.read(buffer)) != -1) { destOs.write(buffer, 0, len); } close(bis); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { close(bis); } } /** * 解压 * * @param src * 源文件,需要是zip文件 * @param dest * 目标文件, */ public static void unzip(String src, String dest, OnUnZipOverListener listener) { File destFile = new File(dest); /* 目标文件不存在,创建之 */ if (!destFile.exists()) { destFile.mkdirs(); } /* 构造源文件 */ File srcFile = new File(src); if (!srcFile.exists()) { return; } unzip(srcFile, dest, listener); } /** * 解压 * * @param srcFile * @param destFile */ public static void unzip(File srcFile, String dest, OnUnZipOverListener listener) { BufferedInputStream bis = null; BufferedOutputStream bos = null; try { ZipFile srcZipFile = new ZipFile(srcFile); /* 获得zipentry的枚举 */ Enumeration e = srcZipFile.entries(); ZipEntry entry = null;// ZipInputStream zis = new ZipInputStream(// new FileInputStream(srcFile)); // while((entry=zis.getNextEntry())!=null){ while (e.hasMoreElements()) { entry = (ZipEntry) e.nextElement(); if (entry.toString().equals("/")) { continue; } bis = new BufferedInputStream(srcZipFile.getInputStream(entry)); /* 构建对应输出流 */ bos = new BufferedOutputStream(new FileOutputStream(dest + "/" + entry.getName())); int len = 0; byte[] buffer = new byte[1024]; while ((len = bis.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.flush(); close(bis); close(bos); } if (listener != null) listener.onUnZipOver(); } catch (ZipException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { close(bis); close(bos); } } /** * 压缩单个或者多个文件,但是不可以同时压缩文件和文件夹 * * @param src * 想要压缩的文件路径,不可以是文件夹 * @param dest * 目标路径,xx.zip */ public static void zipFile(String[] src, String dest, OnZipOverListener listener) { File parent = new File(new File(dest).getParent() + "/temp"); if (!parent.exists()) { parent.mkdirs(); } BufferedInputStream bis = null; BufferedOutputStream bos = null; File file = null; try { int len = 0; byte[] buffer = new byte[1024]; for (String path : src) { file = new File(path); bis = new BufferedInputStream(new FileInputStream(file)); bos = new BufferedOutputStream(new FileOutputStream( parent.getAbsolutePath() + "/" + file.getName())); while ((len = bis.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.flush(); close(bos); close(bis); } zip(parent, dest, listener); for (File ff : parent.listFiles()) { ff.delete(); } parent.delete(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { close(bos); close(bis); } } private static void close(Closeable close) { if (close != null) { try { close.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
GZIP压缩。这个没太搞懂,一直在弄加压解压有点烦了,改天再说吧,贴一下已经实现的简单功能。就是加压一个文件,本身GZIP就是一对一的,也就是说每次只能压缩一个文件,我们需要压缩多个问价的时候要使用tar先打包,看到网上有实现这个功能的,但是使用的阿帕奇的第三方库,就没去试,这部分的有点仓促,主要是烦了,写完这个我就去看点别的了,老看一个东西烦得慌,改天会在完善吧。
代码
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.Closeable;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;/** * * 使用java内置API完成文件的加压解压</br> * 使用gzip压缩压缩效果更好,但是gzip压缩只能是一对一的,也就是说一个压缩包只能解压出一个文件,所以想压缩多个文件时就需要先使用tar压成一个包 * ,再用gzip压缩 * * @author chendong * */public class GZipUtils { /** * gzip压缩,将一个文件压缩到制定包 * * @param src * @param dest */ public static void gzip(String src) { File srcFile = new File(src); if (!srcFile.exists()) { return; } BufferedInputStream bis = null; GZIPOutputStream gos = null; File destFile = new File(src + ".gz"); try { /* 获得输入流 */ bis = new BufferedInputStream(new FileInputStream(src)); /* 获得压缩输出流 */ gos = new GZIPOutputStream(new BufferedOutputStream( new FileOutputStream(destFile))); int len = 0; byte[] buffer = new byte[1024]; while ((len = bis.read(buffer)) != -1) { gos.write(buffer, 0, len); } gos.flush(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { close(gos); close(bis); } } /** * 解压 * @param src * @param dest */ public static void ungzip(String src, String dest) { File destFile = new File(dest); File srcFile = new File(src); GZIPInputStream gis = null; BufferedOutputStream bos = null; try { if (!destFile.exists()) { destFile.createNewFile(); } if (!srcFile.exists()) { return; } bos = new BufferedOutputStream(new FileOutputStream(destFile)); gis = new GZIPInputStream(new FileInputStream(srcFile)); int len = 0; byte[] buffer = new byte[1024]; while ((len = gis.read(buffer)) != -1) { bos.write(buffer, 0, len); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { close(bos); close(gis); } } public static void pack(File files[]) { } private static void close(Closeable close) { if (close != null) { try { close.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
0 0
- JAVAIO之压缩流(zip,Gzip)
- C# 压缩和解压缩(Gzip和Zip的方式)
- C# 压缩和解压缩(Gzip和Zip的方式)
- Thinking in java -- 压缩(GZIP与ZIP格式压缩)
- 六、Linux常用命令之压缩打包篇(gzip、gunzip、tar、zip、bzip2)
- Linux下的压缩之tar,zip,gzip,bzip2
- Zip压缩、解压缩方法(GZip)
- Java 字符串压缩ZIP GZIP
- 备份压缩 gzip、、zip、uzip、
- GZIP/ZIP压缩与解压缩
- 使用GZIP和Zip压缩Java数据流(转)
- Java 笔记:压缩功能(zip和gzip)
- 使用GZIP和Zip压缩Java数据流(转)
- Java IO系列(四):文件压缩GZIP、Zip
- Linux 压缩命令(zip/gzip/bzip/tar)
- Java zip/gzip文件压缩和解压缩
- Java zip/gzip文件压缩和解压缩
- gzip,zip,bzip2 文件压缩和归档
- Android Java连接MySQL数据库
- Android6.0新特性??
- POJ-2209
- hdu 2222 Keywords Search ac自动机
- 使用HttpURLConnection发送Post/Get请求
- JAVAIO之压缩流(zip,Gzip)
- 线性表---顺序存储结构与链式存储结构比较
- C语言——getc()和putc()
- C#中的string与stringbuilder有什么区别
- Oracle 去重复的数据
- UI - Block
- Spark 1.5.0 远程调试
- 计算机网络——物理层
- Ubuntu 系统下 android 开发环境搭建