Java如何实现对文件做压缩和解压缩,比如ZIP RAR之类的

2010-10-27 00:14:55

8 Answers

JDK提供了GZIP、zip的算法实现,可以在java.util.zip包下找到相关的类库,RAR压缩算法JDK并不提供,可以用一些第三方的类库实现

2010-10-27 02:13:00

ZIP类,仅供参考

import java.util.*; import java.util.zip.*; import java.io.*; public class Zip { public Zip(){} /** * 压缩目录下的文件 * @param zipFileName * @param inputFile 目录 * @throws java.lang.Exception */ public void zip(String zipFileName, String inputFile) throws Exception { zip(zipFileName, new File(inputFile)); } /** * 压缩文件 * @param zipFileName * @param inputFile 文件 * @throws java.lang.Exception */ public void zip(String zipFileName, File inputFile) throws Exception { ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName)); zip(out, inputFile, ""); System.out.println("压缩成功!"); out.close(); } public void zip(ZipOutputStream out, File f, String base) throws Exception { System.out.println("正在压缩 " + f.getName()); if (f.isDirectory()) { File[] fl = f.listFiles(); out.putNextEntry(new ZipEntry(base + "/")); base = base.length() == 0 ? "" : base + "/"; for (int i = 0; i < fl.length; i++) { zip(out, fl[i], base + fl[i].getName()); } } else { out.putNextEntry(new ZipEntry(base)); FileInputStream in = new FileInputStream(f); int b; while ( (b = in.read()) != -1) out.write(b); in.close(); } } /** * 解压缩 * @param zipFileName * @param outputDirectory 输出目录 * @throws java.lang.Exception */ public void unzip(String zipFileName, String outputDirectory) throws Exception { ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName)); ZipEntry z; while ( (z = in.getNextEntry()) != null) { System.out.println("正在解压 " + z.getName()); if (z.isDirectory()) { String name = z.getName(); name = name.substring(0, name.length() - 1); File f = new File(outputDirectory + File.separator + name); f.mkdir(); System.out.println("创建目录 " + outputDirectory + File.separator + name); } else { File f = new File(outputDirectory + File.separator + z.getName()); f.createNewFile(); FileOutputStream out = new FileOutputStream(f); int b; while ( (b = in.read()) != -1) out.write(b); out.close(); } } in.close(); } public static void main(String[] args) { try { Zip t = new Zip(); // t.zip("D://IdeaProjects.zip", "D://IdeaProjects"); // t.unzip("d://ddd//api.jar", "d://ddd//"); } catch (Exception e) { e.printStackTrace(System.out); } } }

2010-10-27 04:20:41
/** * 压缩文件 * * @param zipName * 压缩文件名 * @param File * [] 压缩的文件 * @return str */ public static String zipOutputFile(String zipName, File[] files) { File zipFile = new File(zipName); InputStream input = null; ZipOutputStream zipOut = null; try { zipOut = new ZipOutputStream(new FileOutputStream(zipFile)); for (int i = 0; i < files.length; ++i) { if (!files[i].exists()) { System.out.println("文件【files[i].getName()】不存在!"); continue; } input = new FileInputStream(files[i]); zipOut.putNextEntry(new ZipEntry(files[i].getName())); int temp = 0; while ((temp = input.read()) != -1) { zipOut.write(temp); } input.close(); } zipOut.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return zipName; } /** * 解压文件 * * @param zipfile * 解压的文件 * @param dir * 解压路径 * @return str */ public static String zipInput(String zipfile, String dir) { File file = new File(zipfile); File outFile = null; ZipFile zipFile; String fileName = ""; try { zipFile = new ZipFile(file); ZipInputStream zipInput = new ZipInputStream(new FileInputStream(file));//打开压缩包字符流 ZipEntry entry = null; InputStream input = null; OutputStream output = null; while ((entry = zipInput.getNextEntry()) != null) { System.out.println("解压缩" + entry.getName() + "文件******************"); outFile = new File(dir + File.separator + entry.getName()); fileName += outFile.getName()+","; if (!outFile.getParentFile().exists()) { outFile.getParentFile().mkdir(); } if (!outFile.exists()) { outFile.createNewFile(); } input = zipFile.getInputStream(entry); output = new FileOutputStream(outFile); int temp = 0; while ((temp = input.read()) != -1) { output.write(temp); } input.close(); output.close(); } } catch (ZipException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return fileName; }
2010-10-27 07:21:59

GZIP库,之前用过解释Excel2007的excel表格

2010-10-27 08:57:28

推荐看看 snowolf 兄在iteye上发表的一系列文章!

相关链接:
Java压缩技术 

2010-10-27 10:17:13

有很多经典的压缩算法的实现
压缩无非就是节省数据所占的空间
js中运用压缩 未必是件好事 个人觉得
因为这相当于 时间换空间 效率 必定大打折扣
希望我说的 不是与话题无关的 但是我确实是这么想的
如果让我来说 js中运用压缩 载高效的算法都是无济于事的
以每种技术运用的场合 还有大局出发才是一个程序员该干的
见过一些主程 对网页中的瑕疵不屑一顾 导致如今网页游戏 真是不怎么样 而且经常崩溃

不好意思 我看错题目了 我以为是问 js实现压缩呢 原来是java

2010-10-27 11:37:51
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制