import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.Vector;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
* 压缩文件类,支持添加文件或文件夹
* @author Teddy
*
*/
public class ZipUtil {
/*存放添加的文件集合*/
private static Vector files = new Vector();
/*存放所有文件的集合*/
private static Vector all_files = new Vector();
/**
* 功能:
* @param args
*/
public static void main(String[] args) {
long a = System.currentTimeMillis();
System.out.println("开始压缩文件");
ZipUtil zip = new ZipUtil();
File f1 = new File("g:\\zip_test\\sogou_pinyin_52c.exe");
zip.addFile(f1);
zip.addFile(new File("g:\\xiahps\\主题\\note.Gadget"));
File ff [] = zip.getListFiles();
zip.zipFiles(ff, new File("g:\\abc.zip"), "g:\\");
zip.clear();
long b = System.currentTimeMillis()-a;
System.out.println("压缩完毕!耗时:"+(double)b/1000+"秒");
System.out.println("开始解压文件");
zip.unZipFiles("g:\\abc.zip","g:\\zzw");
long c = System.currentTimeMillis()-a;
System.out.println("解压完毕!总耗时:"+(double)c/1000+"秒");
}
public ZipUtil(){}
/**
* 添加待压缩的文件(支持添加文件夹)
* @param f
*/
public static void addFile(File f){
if(f==null||!f.exists())return;
if(!files.contains(f)) files.addElement(f);
}
/**
* 获取文件列表
* @return
*/
public static File [] getListFiles(){
File list_files [] = null;
if(files==null||files.size()==0)return null;
for(int i=0;i<files.size();i++){
File f = (File)files.get(i);
refreshFileList(f.getAbsolutePath());
}
list_files = new File[all_files.size()];
for(int i=0;i<all_files.size();i++){
list_files[i] = (File)all_files.elementAt(i);
}
return list_files;
}
/**
* 装载一个目录或文件
* @param strPath
*/
public static void refreshFileList(String strPath) {
File dir = new File(strPath);
//是文件直接装载
if(dir!=null&&dir.isFile()){all_files.add(dir);return;}
File[] ff = dir.listFiles();
if (ff == null)
return;
for (int i = 0; i < ff.length; i++) {
if (ff[i].isDirectory()) {
refreshFileList(ff[i].getAbsolutePath());
} else {
String strFileName = ff[i].getAbsolutePath().toLowerCase();
if(!all_files.contains(strFileName))
all_files.add(ff[i]);
}
}
}
/**
* 不替换路径的压缩
* @param srcfile
* @param zipfile
*/
public static void zipFiles(File[] srcfile,File zipfile){
zipFiles(srcfile,zipfile,null);
}
/**
* 功能:压缩多个文件或文件夹成一个zip文件
* @param srcfile:源文件列表
* @param zipfile:压缩后的文件
* @param repstr:绝对路径替换
*/
public static void zipFiles(File[] srcfile,File zipfile,String repstr){
byte[] buf=new byte[1024];
try {
ZipOutputStream out=new ZipOutputStream(new FileOutputStream(zipfile));
out.setEncoding("GBK");//解决中文问题
for(int i=0;i<srcfile.length;i++){
if(srcfile[i].isDirectory())zipFiles(srcfile[i].listFiles(),zipfile,repstr);//是文件夹,递归继续压缩
FileInputStream in=new FileInputStream(srcfile[i]);
if(repstr==null||repstr.equals(""))
out.putNextEntry(new ZipEntry(srcfile[i].getAbsolutePath()));
else
out.putNextEntry(new ZipEntry(com.jspsoft.util.StringEx.replace(srcfile[i].getAbsolutePath(), repstr, "")));//处理压缩文件带路径的情况,使用srcfile[i].getAbsolutePath()
//System.out.println("正在压缩 "+srcfile[i].getAbsolutePath());
int len;
//out.write(enstr.getBytes());
while((len=in.read(buf))>0){
out.write(buf,0,len);
}
out.closeEntry();
in.close();
}
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 默认不带解压路径就解压到当前文件夹
* @param source
*/
public static void unZipFiles(String source){
unZipFiles(source,null);
}
/**
* 解压文件
* @param source:压缩文件
* @param destination:解压地址
*/
public static void unZipFiles(String source, String destination){
try {
if(destination==null||destination.equals(""))
destination = new File(source).getParent();
int buffer=1024;
ZipFile zipFile = new ZipFile(source);
Enumeration emu = zipFile.getEntries();
while (emu.hasMoreElements()) {
ZipEntry entry = (ZipEntry) emu.nextElement();
if(destination!=null&&destination.lastIndexOf("\\")!=destination.length()-1)
destination+="\\";//增强容错性
//System.out.println("正在解压 "+destination+entry.getName());
//目录不存在创建目录
if (entry.isDirectory()) {
new File(destination + entry.getName()).mkdirs();
continue;
}
BufferedInputStream bis = new BufferedInputStream(zipFile
.getInputStream(entry));
File file = new File(destination + entry.getName());
//文件所在目录如果不存在则创建
File parent = file.getParentFile();
if (parent != null && (!parent.exists())) {
parent.mkdirs();
}
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos, buffer);
int count;
byte data[] = new byte[buffer];
while ((count = bis.read(data, 0, buffer)) != -1) {
bos.write(data, 0, count);
}
bos.flush();
bos.close();
bis.close();
}
zipFile.close();
} catch (Exception e) {e.printStackTrace();}
}
/**
* 释放资源
*/
public static void clear(){
if(all_files!=null&&all_files.size()>0)all_files.removeAllElements();
if(files!=null&&files.size()>0)files.removeAllElements();
}
public static Vector getFiles() {
return files;
}
public static void setFiles(Vector files) {
ZipUtil.files = files;
}
}
分享到:
相关推荐
在标题中提到的"java实现对文件或文件夹的压缩和解压缩",我们可以使用这个库来实现。具体来说,我们可以创建一个`ZipUtil`类,里面包含压缩和解压缩的静态方法。 首先,为了压缩文件或文件夹,我们需要使用`org....
在Java编程语言中,将...实践中,可以结合描述中的"JAVA实现将文件或文件夹压缩成ZIP格式.txt"文件,查看具体的代码示例和详细解释,进一步加深理解。记得在编程时,保持代码的清晰和可维护性,遵循良好的编程实践。
总之,`ZipCompressor.java`是实现文件和文件夹压缩的关键类,它利用了Java标准库提供的`ZipOutputStream`和`ZipEntry`,通过一系列的步骤,将原始文件和目录打包成ZIP格式的压缩文件。熟悉这些概念和API,开发者就...
在Java编程语言中,压缩文件夹到指定目录和指定名称是一项常见的任务,这通常涉及到对文件系统的操作和使用压缩库。Java提供了多种方法来实现这一功能,比如使用内置的`java.util.zip`包或者第三方库如Apache ...
JAVA实现对文件夹“加密码压缩” 此资源解压后为一个文件夹,就是一个package包 (压缩后为Zip文件) 无需导入任何个人jar包 压缩后效果等同于用winrar给压缩包加密码 时间紧迫,暂时存在中文文件夹名称乱码问题...
以上就是使用Java内置IO流实现文件夹压缩和ZIP压缩包解压的详细过程。这种方式简单且自给自足,无需额外引入外部库。不过需要注意的是,这种方法并不支持ZIP文件的一些高级特性,例如密码保护、存档时间戳等。如果...
总结起来,Java通过Apache Commons Compress库提供的API,可以方便地实现多层级目录的文件压缩和解压。`FileUtils.java`类是这个功能的具体实现,它封装了上述的压缩和解压过程,使开发者能够轻松地在代码中调用这些...
描述中提到的“java实现压缩文件文件夹”是指使用Java编程语言来执行文件和文件夹的压缩操作。Java标准库提供了一个名为`java.util.zip`的包,其中包含了一些类(如ZipOutputStream)用于创建ZIP格式的压缩文件。...
在Java编程环境中,打包文件或文件夹到zip压缩包是一项常见的任务,这通常涉及到I/O操作和文件处理。`ZIPUtil`可能是一个自定义的工具类,用于简化这个过程。以下是一些关于如何在Java中实现这个功能的关键知识点: ...
在Java编程中,向现有的ZIP压缩包追加文件通常需要经过解压、修改、再压缩的步骤,因为标准的Java ZIP库(如`java.util.zip`包)并不直接支持追加到已存在的ZIP文件。本篇文章将深入探讨如何实现这个功能,主要关注...
"支持多文件及文件夹压缩工具"这一主题聚焦于能够处理多个文件和目录并将其整合到单个压缩文件中的软件或库。在本篇中,我们将深入探讨这一功能的工作原理、常见算法、应用场景以及相关的编程实现。 首先,我们要...
在Java编程语言中,我们可以利用SWING库来构建用户界面,实现文件或文件夹的压缩功能。以下是对"JAVA实现的文件压缩"这一主题的详细讲解。 1. **Java SWING简介** Java SWING是Java Foundation Classes (JFC)的一...
### Java 实现多个文件压缩成 RAR 压缩包 #### 背景与目的 在日常工作中,经常会遇到需要将多个文件压缩为一个压缩包的情况,以便于存储、传输或备份。Java 作为一种广泛使用的编程语言,在处理文件操作方面提供了...
在Java编程语言中,处理文件和文件夹的压缩与解压是常见的任务,尤其是在需要传输大量数据或存储空间有限的情况下。Zip格式是一种广泛使用的压缩格式,Java提供了内建的API来支持这种格式,使得开发者可以方便地进行...
Java实现把文件及文件夹压缩成zip Java语言中实现文件及文件夹的压缩成zip格式是非常常见的需求。以下是Java实现把文件及文件夹压缩成zip的详细知识点: 1. 使用Java的ZipOutputStream和ZipEntry类实现文件及...
本篇文章将深入探讨如何使用纯Java实现这一功能,特别关注如何解压和压缩单个或多个文件以及整个文件夹。我们将涵盖核心的Java API,如`java.util.zip`包中的类,以及实际的代码示例。 首先,我们需要了解`java....
本文将详细讲解如何使用Java实现文件和文件夹的压缩以及解压缩功能。 首先,Java标准库提供了`java.util.zip`包,其中包含了一些用于处理ZIP和GZIP格式的类。在“java文件解压缩”的场景下,我们主要会用到`...
通过JNI,我们可以调用这些API来创建新的RAR文件,添加文件,设置压缩参数等。 4. **Java代码示例** 在Java中,我们需要声明本地方法,例如: ```java public native int createRar(String rarPath, String[] ...
在Java后台中,批量下载文件压缩成zip下载可以使用Java的文件输入输出流和zip压缩流来实现。首先,需要在Servlet中获取文件列表,然后使用循环将文件一个个添加到zip文件中,最后下载zip文件到本地桌面。 java批量...
在.NET开发环境中,有时我们需要对文件或文件夹进行压缩处理,以便于存储、传输或备份。SharpZipLib是一个流行的开源库,它为.NET开发者提供了强大的ZIP和GZip压缩功能。本文将详细介绍如何利用SharpZipLib库来实现...