java 如何将多个文件打包成一个zip ?

sking_2008 2009-07-02 03:59:05

我可以得到需要下载的文件路径
String[] path;//这个已知
就是如何将这些文件打包成一个zip供下载?
希望高手们写下详细代码.``
...全文
2485 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
nchzh302 2010-06-02
  • 打赏
  • 举报
回复
学习下
yinliao 2010-05-27
  • 打赏
  • 举报
回复
要用到了。。。。学习一下。。
myhonor 2009-07-13
  • 打赏
  • 举报
回复
貌似JDK自带的那个ZIP有些问题,网上都建议用APACHE的
Looking_Glass 2009-07-11
  • 打赏
  • 举报
回复
日!这个问题我已经发过N次拉!
caironghuicxz 2009-07-10
  • 打赏
  • 举报
回复
我看已经解决了这个问题了啊。
cuij7718 2009-07-10
  • 打赏
  • 举报
回复
不管如何做,如果用JDK 的zip压缩,中文问题早晚会碰到,如果碰到了,到apache上面下在他的zip包用就可以了,这个不是单独的一个zip,是和别的打包在一起的,哪一个忘了
找到以后删除多余的,最终也就70kb左右,支持zip,tar,gzip
zl3450341 2009-07-10
  • 打赏
  • 举报
回复
关注
网络科技 2009-07-10
  • 打赏
  • 举报
回复
要用第三方包,学习了
cuij7718 2009-07-10
  • 打赏
  • 举报
回复
真是重赏之下必有勇夫,还真有给写代码的,给一个思路就可以了
薪水 2009-07-06
  • 打赏
  • 举报
回复
帮顶
lcb521 2009-07-06
  • 打赏
  • 举报
回复
关注!
pathuang68 2009-07-06
  • 打赏
  • 举报
回复
飘过,学习
Monkey_D_Luffy 2009-07-06
  • 打赏
  • 举报
回复
看起来已经解决了
ttmotor2008 2009-07-04
  • 打赏
  • 举报
回复
路过,学习.
hbwhwang 2009-07-03
  • 打赏
  • 举报
回复
代码运行需要 ant.jar


import java.io.*;
import java.util.Enumeration;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

public class ZipUtil {

/**
* 压缩。
*
* @param src
* 源文件或者目录
* @param dest
* 压缩文件路径
* @throws IOException
*/
public static void zip(String src, String dest) throws IOException {
ZipOutputStream out = null;
try {
File outFile = new File(dest);
out = new ZipOutputStream(outFile);
File fileOrDirectory = new File(src);

if (fileOrDirectory.isFile()) {
zipFileOrDirectory(out, fileOrDirectory, "");
} else {
File[] entries = fileOrDirectory.listFiles();
for (int i = 0; i < entries.length; i++) {
// 递归压缩,更新curPaths
zipFileOrDirectory(out, entries[i], "");
}
}

} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
}
}
}
}

/**
* 递归压缩文件或目录
*
* @param out
* 压缩输出流对象
* @param fileOrDirectory
* 要压缩的文件或目录对象
* @param curPath
* 当前压缩条目的路径,用于指定条目名称的前缀
* @throws IOException
*/
private static void zipFileOrDirectory(ZipOutputStream out,
File fileOrDirectory, String curPath) throws IOException {
FileInputStream in = null;
try {
if (!fileOrDirectory.isDirectory()) {
// 压缩文件
byte[] buffer = new byte[4096];
int bytes_read;
in = new FileInputStream(fileOrDirectory);

ZipEntry entry = new ZipEntry(curPath
+ fileOrDirectory.getName());
out.putNextEntry(entry);

while ((bytes_read = in.read(buffer)) != -1) {
out.write(buffer, 0, bytes_read);
}
out.closeEntry();
} else {
// 压缩目录
File[] entries = fileOrDirectory.listFiles();
for (int i = 0; i < entries.length; i++) {
// 递归压缩,更新curPaths
zipFileOrDirectory(out, entries[i], curPath
+ fileOrDirectory.getName() + "/");
}
}
} catch (IOException ex) {
ex.printStackTrace();
throw ex;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ex) {
}
}
}
}

/**
* 解压缩。
*
* @param zipFileName
* 源文件
* @param outputDirectory
* 解压缩后文件存放的目录
* @throws IOException
*/
public static void unzip(String zipFileName, String outputDirectory)
throws IOException {

ZipFile zipFile = null;

try {
zipFile = new ZipFile(zipFileName);
Enumeration e = zipFile.getEntries();

ZipEntry zipEntry = null;

File dest = new File(outputDirectory);
dest.mkdirs();

while (e.hasMoreElements()) {
zipEntry = (ZipEntry) e.nextElement();

String entryName = zipEntry.getName();

InputStream in = null;
FileOutputStream out = null;

try {
if (zipEntry.isDirectory()) {
String name = zipEntry.getName();
name = name.substring(0, name.length() - 1);

File f = new File(outputDirectory + File.separator
+ name);
f.mkdirs();
} else {
int index = entryName.lastIndexOf("\\");
if (index != -1) {
File df = new File(outputDirectory + File.separator
+ entryName.substring(0, index));
df.mkdirs();
}
index = entryName.lastIndexOf("/");
if (index != -1) {
File df = new File(outputDirectory + File.separator
+ entryName.substring(0, index));
df.mkdirs();
}

File f = new File(outputDirectory + File.separator
+ zipEntry.getName());
// f.createNewFile();
in = zipFile.getInputStream(zipEntry);
out = new FileOutputStream(f);

int c;
byte[] by = new byte[1024];

while ((c = in.read(by)) != -1) {
out.write(by, 0, c);
}
out.flush();
}
} catch (IOException ex) {
ex.printStackTrace();
throw new IOException("解压失败:" + ex.toString());
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ex) {
}
}
if (out != null) {
try {
out.close();
} catch (IOException ex) {
}
}
}
}

} catch (IOException ex) {
ex.printStackTrace();
throw new IOException("解压失败:" + ex.toString());
} finally {
if (zipFile != null) {
try {
zipFile.close();
} catch (IOException ex) {
}
}
}

}

public static void main(String[] args) {
try {
ZipUtil.zip("C:\\0115080120081024","d:\\0115080120081027.zip");
//ZipUtil.unzip("D:\\a\\010108012008-8-25.zip", "d:\\a\\tmp");
} catch (Exception e) {
e.printStackTrace();
}

}

}


neohope 2009-07-02
  • 打赏
  • 举报
回复
打成jar就不行吗?将源代码一起打进去
晨星 2009-07-02
  • 打赏
  • 举报
回复
如果可以的话,调用ant任务更简单。嘿嘿。
scueczhang 2009-07-02
  • 打赏
  • 举报
回复
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

public class DirectoryZip {
public static void jar(String inputFileName, String outputFileName) throws Exception {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outputFileName));
out.setEncoding("GBK"); // ###### 这句话是关键,指定输出的编码方式
File f = new File(inputFileName);
jar(out, f, "");
out.close();
}

private static void jar(ZipOutputStream out, File f, String base) throws Exception {
if (f.isDirectory()) {
File[] fl = f.listFiles();
base = base.length() == 0 ? "" : base + "/";
out.putNextEntry(new ZipEntry(base));
for (int i = 0; i < fl.length; i++) {
jar(out, fl[i], base + fl[i].getName());
}
} else {
out.putNextEntry(new ZipEntry(base));
FileInputStream in = new FileInputStream(f);
byte[] buffer = new byte[1024];
int n = in.read(buffer);
while (n != -1) {
out.write(buffer, 0, n);
n = in.read(buffer);
}
in.close();
}
}

public static void main(String[] args) {
try {
jar("D:\\temp\\1", "d://mytest.zip");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
yanhan0615 2009-07-02
  • 打赏
  • 举报
回复
网上有现成的,直接递归即可
老紫竹 2009-07-02
  • 打赏
  • 举报
回复
整个目录的压缩成一个zip文件

其实就是一个不断的压缩的过程!
加载更多回复(1)
主要特性Java 语言是简单的:Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。Java 语言是面向对象的:Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。Java语言是分布式的:Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。Java 语言是健壮的:Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。Java语言是安全的:Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。Java 语言是体系结构中立的:Java 程序(后缀为 java文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。Java 语言是可移植的:这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。Java 语言是解释型的:如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。Java 是高性能的:与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。Java 语言是多线程的:在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。Java 语言是动态的:Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经为使用最广泛的Java SDK(Software development kit)。  JDK 是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握 JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。  从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本信息也不再延续以前的1.2,1.3,1.4,而是变了5.0,6.0了。从 6.0开始,其运行效率得到了非常大的提高,尤其是在桌面应用方面。  JDK本身使用了Java语言编写,在我们下载的安装包里,有一个src.zip,里面就是JDK的源代码。版本  SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。  EE(J2EE),enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。  ME(J2ME),micro edtion,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,改名为Java ME。组  JDK包含的基本组件包括:  ·javac – 编译器,将源程序转字节码   ·jar – 打包工具,将相关的类文件打包一个文件   ·javadoc – 文档生器,从源码注释中提取文档   ·jdb – debugger,查错工具   ·java – 运行编译后的java程序(.class后缀的)   appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。  Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。   Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。   Jconsole: Java进行系统调试和监控的工具常用的package  java.lang: 这个是系统的基础类,比如String等都是这里面的,这个package是唯一一个可以不用import就可 以使用的Package  java.io: 这里面是所有输入输出有关的类,比如文件操作等  java.net: 这里面是与网络有关的类,比如URL,URLConnection等。  java.util : 这个是系统辅助类,特别是集合类Collection,List,Map等。  java.sql: 这个是数据库操作的类,Connection, Statememt,ResultSet等  javax.servlet: 这个是JSP,Servlet等使用到的类

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧