Java解压缩文件简单实例

package com.cwqi.demo;
/**
 *@author Cwqi
 *2015-8-26上午9:59:12
 */

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Zip;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

public class ZipDemo {

	/**
	 * 解压
	 * @param zipFilePath:压缩文件路径
	 */
	public static void unzip(String zipFilePath) {
		unzipFile(zipFilePath, null);
	}

	public static File buildFile(String fileName, boolean isDirectory) {
		File target = new File(fileName);
		if (isDirectory) {
			target.mkdirs();
		} else {
			if (!target.getParentFile().exists()) {
				target.getParentFile().mkdirs();
			}
		}
		return target;
	}

	/**
	 * 解压
	 * @param zipFilePath zip文件路径
	 * @param targetPath  解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下
	 */
	public static void unzipFile(String zipFilePath, String targetPath) {
		OutputStream os = null;
		InputStream is = null;
		ZipFile zipFile = null;
		try {
			zipFile = new ZipFile(zipFilePath);
			String directoryPath = "";
			if (null == targetPath || "".equals(targetPath)) {
				directoryPath = zipFilePath.substring(0,
						zipFilePath.lastIndexOf("."));
			} else {
				directoryPath = targetPath;
			}
			@SuppressWarnings("unchecked")
			Enumeration<ZipEntry> entryEnum = zipFile.getEntries();

			if (null != entryEnum) {
				ZipEntry zipEntry = null;
				while (entryEnum.hasMoreElements()) {
					zipEntry = entryEnum.nextElement();
					if (zipEntry.isDirectory()) {
						new File(directoryPath + File.separator
								+ zipEntry.getName()).mkdirs();
						continue;
					}
					if (zipEntry.getSize() > 0) {
						// 文件
						File targetFile = ZipDemo.buildFile(directoryPath
								+ File.separator + zipEntry.getName(), false);
						os = new BufferedOutputStream(new FileOutputStream(
								targetFile));
						is = zipFile.getInputStream(zipEntry);
						byte[] buffer = new byte[4096];
						int readLen = 0;
						while ((readLen = is.read(buffer, 0, 4096)) >= 0) {
							os.write(buffer, 0, readLen);
						}
						os.flush();
						os.close();
					} else {
						// 空目录
						ZipDemo.buildFile(directoryPath + File.separator
								+ zipEntry.getName(), true);
					}
				}
			}
		} catch (IOException ex) {
			ex.printStackTrace();
		} finally {
			if (null != zipFile) {
				zipFile = null;
			}
			if (null != is) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (null != os) {
				try {
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	static final int BUFFER = 2048;

	/**
	 * 压缩
	 * @param sourceFile 为要压缩的文件或文件目录
	 * @param targetFile 为要生成zip文件的路径和文件名,如:"D:\\downloads.zip"
	 */
	public static void zipFiles(String sourceDir, String targetFile) {
		File sourceFile = new File(sourceDir);
		File zFile = new File(targetFile);
		ZipOutputStream zos = null;
		try {

			OutputStream os;
			os = new FileOutputStream(zFile);
			BufferedOutputStream bos = new BufferedOutputStream(os);
			zos = new ZipOutputStream(bos);

			String basePath = null;

			if (sourceFile.isDirectory()) {
				basePath = sourceFile.getPath();
			} else {
				basePath = sourceFile.getParent();
			}
			zipFile(sourceFile, basePath, zos);

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

	private static void zipFile(File sourceFile, String basePath,
			ZipOutputStream zos) throws IOException {
		File[] files = null;
		if (sourceFile.isDirectory()) {
			files = sourceFile.listFiles();
		} else {
			files = new File[] { sourceFile };
		}

		InputStream is = null;
		BufferedInputStream bis = null;
		String pathName;
		byte[] buf = new byte[BUFFER];
		int length = 0;
		try {
			for (File file : files) {
				if (file.isDirectory()) {
					pathName = file.getPath().substring(basePath.length() + 1)
							+ "/";
					zos.putNextEntry(new ZipEntry(pathName));
					zipFile(file, basePath, zos);
				} else {
					pathName = file.getPath().substring(basePath.length() + 1);
					is = new FileInputStream(file);
					bis = new BufferedInputStream(is);
					zos.putNextEntry(new ZipEntry(pathName));
					while ((length = bis.read(buf)) != -1) {
						zos.write(buf, 0, length);
					}
				}
			}
		} finally {
			if (bis != null) {
				bis.close();
			}
			if (is != null) {
				is.close();
			}
		}

	}

	/**
	 * 使用ant压缩
	 * @param srcPathName
	 * @param destPathName
	 */ 
	public static void zipByAnt(String srcPathName,String destPathName) {
		File srcdir = new File(srcPathName);
		if (!srcdir.exists()){
			throw new RuntimeException(srcPathName + "no exist!");
		}
		Project project = new Project();
		Zip zip = new Zip();
		zip.setProject(project);

		File zipFile = new File(destPathName);
		zip.setDestFile(zipFile);
		FileSet fileSet = new FileSet();
		fileSet.setProject(project);
		fileSet.setDir(srcdir);
		// fileSet.setIncludes("**/*.java");
		// fileSet.setExcludes(*.txt); 
		zip.addFileset(fileSet);
		zip.execute();
	}

	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		unzipFile("D:\\Downloads.zip", "D:\\Downloads");
		//zipFiles("D:\\Downloads", "D:\\Downloads.zip");
		//zipByAnt("D:\\Downloads", "D:\\Downloads.zip");

	}
}
时间: 2024-12-13 23:51:52

Java解压缩文件简单实例的相关文章

java网页爬虫简单实例详解——获取天气预报。

[本文介绍] 爬取别人网页上的内容,听上似乎很有趣的样子,只要几步,就可以获取到力所不能及的东西,例如呢?例如天气预报,总不能自己拿着仪器去测吧!当然,要获取天气预报还是用webService好.这里只是举个例子.话不多说了,上看看效果吧. [效果] 我们随便找个天气预报的网站来试试:http://www.weather.com.cn/html/weather/101280101.shtml 从图中可用看出,今天(6日)的天气.我们就以这个为例,获取今天的天气吧! 最终后台打印出: 今天:6日

Java UDP的简单实例以及知识点简述

UDP的实现 Java中实现UDP协议的两个类,分别是DatagramPacket数据包类以及DatagramSocket套接字类. 其与TCP协议实现不同的是: UDP的套接字DatagramSocket相比于Socket.ServerSocket来说,是一个非常简单的概念,没有连接的含义.套接字只需要知道侦听和发送数据包的本地端口即可. 也就是在TCP协议中庸Socket类和ServerSocket类进行功能划分,UDP协议中只用一个数据包套接字DatagramSocket发送和接受数据即可

Java WebService 开发简单实例

Web Service 是一种新的web应用程序分支,他们是自包含.自描述.模块化的应用,可以发布.定位.通过web调用.Web Service可以执行从简单的请求到复杂商务处理的任何功能.一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务. 实际上,WebService的主要目标是跨平台的可互操作性.为了达到这一目标,WebService完全基于XML(可扩展标记语言). XSD(XMLSchema)等独立于平台.独立于软件供应商的标准,是创建可互操作的.分布式应用程序

java swing最简单实例(1) 一个空的JFrame

我准备写一个系列的java图形化界面的教程.每个程序都尽量只写维持运行所需的最简化程度的代码,好让大家都看懂. 使用java图形界面只需要jdk,eclipse即可.如果布局抽象能力不够强大,建议装jigloo先用它布局然后再抄代码.(jigloo自动生成的代码冗余量太大,放的位置也不合理,只是为了看效果,之后还是需要ctrl+C,ctrl+V的) 要想放置一切东西,我们需要先有一个JFrame.所以就先讲一讲怎样创建一个空的JFrame. 下面是一个最简单的例子,首先我们需要extends J

java组合排序简单实例

输入m个A和n个B,输出A,B的组合数: import java.util.Scanner; public class Main1 { public static void main(String[] args) { // TODO Auto-generated method stubScanner input=new Scanner(System.in);int m=input.nextInt();int n=input.nextInt();System.out.println(f(m,n))

PHP调用JAVA的WebService简单实例

使用PHP调用JAVA语言开发的WebService.客户端提交两个String类型的参数,服务端返回一个对象类型.服务端使用AXIS-1.4作为SOAP引擎.客户端为PHP5.2.9,使用NuSOAP作为SOAP引擎. 服务端: 对象类 import java.io.Serializable; public class Person implements Serializable { /** * */ private static final long serialVersionUID = -

java swing最简单实例(2) 往JFrame里面放一个容器或组件

可以往JFrame里面放的东西有两种,Containers和Components.在jigloo的图形化界面上可以清楚的看到这些 常用的Containers(容器)有这些: JFrame带标题和关闭按钮的界面 JPanel面板 JScrollPane带滚动条的面板 JSplitPane带分栏的面板 JTabbedPane标签页结构的面板 JDialog对话框 常用的Components(组件)有这些 JButton按钮 JLabel标签(用于显示固定不变的文字 JTextField文本框(用于让

java Socket通信简单实例

import java.io.*; import java.net.*; public class ClientTest { public static void main(String[] args) throws Exception { Socket s = new Socket("localhost", 8888); DataOutputStream dos = new DataOutputStream(s.getOutputStream()); dos.writeUTF(&qu

java反射机制-简单实例

public class Car { private String brand; private String color; private int maxSpeed; public Car() { } public Car(String brand, String color, int maxSpeed) { this.brand = brand; this.color = color; this.maxSpeed = maxSpeed; } public String getBrand()