`
吕悦ly
  • 浏览: 1288 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

java压缩与解压缩,写个文章记录一下

阅读更多
支持gz,zip,jar的压缩与解压缩,用到的jar:commons-compress-1.5.jar、commons-io-2.4.jar、commons-lang3-3.1.jar。话不多说,直接上代码:
public class CompressAndExtractFileUtils {
	private final static CompressAndExtractFileUtils instance = new CompressAndExtractFileUtils();
	private final static String DEFAULT_ENCODING = "UTF-8";

	private CompressAndExtractFileUtils() {
	}

	public void compressFile(String srcPath, String destPath) {
		compressFile(srcPath, destPath, DEFAULT_ENCODING);
	}

	public void compressFile(String srcPath, String destPath, String encoding) {
		FileOutputStream fos = null;
		ArchiveOutputStream os = null;
		try {
			if (StringUtils.isEmpty(encoding)) {
				encoding = DEFAULT_ENCODING;
			}
			File destFile = mkFile(destPath);// mkFile
			fos = new FileOutputStream(destFile);
			String extension = getExtension(destPath);
			os = getArchiveOutputStream(extension, fos, encoding);
			compressFile(os, extension, srcPath);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(os);
			IOUtils.closeQuietly(fos);
		}

	}

	private void compressFile(ArchiveOutputStream os, String extension, String srcPath) {
		String basePath = getBasePath(srcPath);
		if ("zip".equals(extension)) {
			compressZipFile(os, srcPath, basePath);
		} else if ("jar".equals(extension)) {
			compressJarFile(os, srcPath, basePath);
		} else if ("tar".equals(extension) || "gz".equals(extension)) {
			compressTarFile(os, srcPath, basePath);
		}

	}

	private void compressJarFile(ArchiveOutputStream os, String srcPath, String basePath) {
		File f = new File(srcPath);
		if (f.isFile()) {
			FileInputStream fis = null;
			try {
				JarArchiveEntry entry = new JarArchiveEntry(srcPath.substring(basePath.length()));
				os.putArchiveEntry(entry);
				fis = new FileInputStream(f);
				IOUtils.copy(fis, os);
				os.closeArchiveEntry();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				IOUtils.closeQuietly(fis);
			}
		} else {
			File[] subFile = f.listFiles();
			for (File sub : subFile) {
				compressJarFile(os, sub.getAbsolutePath(), basePath);
			}
		}
	}

	private void compressTarFile(ArchiveOutputStream os, String srcPath, String basePath) {
		File f = new File(srcPath);
		if (f.isFile()) {
			FileInputStream fis = null;
			try {
				TarArchiveEntry entry = new TarArchiveEntry(f, srcPath.substring(basePath.length()));
				os.putArchiveEntry(entry);
				fis = new FileInputStream(f);
				IOUtils.copy(fis, os);
				os.closeArchiveEntry();
				os.flush();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				IOUtils.closeQuietly(fis);
			}
		} else {
			File[] subFile = f.listFiles();
			for (File sub : subFile) {
				compressTarFile(os, sub.getAbsolutePath(), basePath);
			}
		}
	}

	private void compressZipFile(ArchiveOutputStream os, String srcPath, String basePath) {
		File f = new File(srcPath);
		if (f.isFile()) {
			FileInputStream fis = null;
			try {
				ZipArchiveEntry entry = new ZipArchiveEntry(srcPath.substring(basePath.length()));
				os.putArchiveEntry(entry);
				fis = new FileInputStream(f);
				IOUtils.copy(fis, os);
				os.closeArchiveEntry();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				IOUtils.closeQuietly(fis);
			}
		} else {
			File[] subFile = f.listFiles();
			for (File sub : subFile) {
				compressZipFile(os, sub.getAbsolutePath(), basePath);
			}
		}
	}

	private ArchiveOutputStream getArchiveOutputStream(String extension, FileOutputStream fos, String encoding) throws Exception {
		// create factory
		ArchiveStreamFactory factory = new ArchiveStreamFactory();
		// set entryEncoding
		factory.setEntryEncoding(encoding);
		// return ArchiveOutputStream with extension
		if ("gz".equals(extension) || "tar".equals(extension)) {
			return factory.createArchiveOutputStream(ArchiveStreamFactory.TAR, fos);
		} else if ("zip".equals(extension)) {
			return factory.createArchiveOutputStream(ArchiveStreamFactory.ZIP, fos);
		} else if ("jar".equals(extension)) {
			return factory.createArchiveOutputStream(ArchiveStreamFactory.JAR, fos);
		}
		return null;
	}
	

	public void extractFile(String srcFile, String destFile) {
		extractFile(srcFile, destFile, DEFAULT_ENCODING);
	}

	public void extractFile(String srcFile, String destFile, String encoding) {
		File file = new File(destFile);
		if (!file.exists()) {
			file.mkdir();
		}
		FileInputStream fis = null;
		ArchiveInputStream in = null;
		try {
			if (StringUtils.isEmpty(encoding)) {
				encoding = DEFAULT_ENCODING;
			}
			fis = new FileInputStream(srcFile);
			String extension = getExtension(srcFile);
			in = getArchiveInputStream(fis, extension, encoding);
			extractFile(in, extension, destFile);
		} catch (Exception e) {
			e.printStackTrace();
		} catch (Throwable t) {
			t.printStackTrace();
		} finally {
			IOUtils.closeQuietly(in);
			IOUtils.closeQuietly(fis);
		}
	}

	private void extractFile(ArchiveInputStream in, String extension, String outputDirectory) {
		if ("gz".equals(extension) || "tar".equals(extension)) {
			extractFile(in, outputDirectory, TarArchiveEntry.class);
		} else if ("zip".equals(extension)) {
			extractFile(in, outputDirectory, ZipArchiveEntry.class);
		} else if ("jar".equals(extension)) {
			extractFile(in, outputDirectory, JarArchiveEntry.class);
		}
	}

	@SuppressWarnings("unchecked")
	public <T extends ArchiveEntry> void extractFile(ArchiveInputStream in, String outputDirectory, Class<T> T) {
		BufferedInputStream bis = null;
		try {
			bis = new BufferedInputStream(in);
			T entry = null;
			while ((entry = (T) in.getNextEntry()) != null) {
				String name = entry.getName();
				System.out.println("name:" + name);
				String[] names = name.split("/");
				String fileName = outputDirectory;
				for (int i = 0; i < names.length; i++) {
					String str = names[i];
					fileName = fileName + File.separator + str;
				}
				if (name.endsWith("/")) {
					mkFolder(fileName);
				} else {
					BufferedOutputStream bos = null;
					try {
						File file = mkFile(fileName);
						bos = new BufferedOutputStream(new FileOutputStream(file));
						IOUtils.copy(in, bos);
					} catch (Exception e) {
						e.printStackTrace();
					} finally {
						IOUtils.closeQuietly(bos);
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} catch (Throwable t) {
			t.printStackTrace();
		} finally {
			IOUtils.closeQuietly(bis);
		}
	}

	public void extractZipFile() {

	}

	private void mkFolder(String fileName) {
		System.out.println("make folder[" + fileName + "]");
		File f = new File(fileName);
		if (!f.exists()) {
			f.mkdirs();
		}
	}

	private File mkFile(String fileName) {
		System.out.println("make file[" + fileName + "]");
		File f = new File(fileName);
		try {
			File parent = f.getParentFile();
			if (!parent.exists()) {
				parent.mkdirs();
			}
			f.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return f;
	}

	public static CompressAndExtractFileUtils getInstance() {
		return instance;
	}

	public ArchiveInputStream getArchiveInputStream(FileInputStream fis, String extension, String encoding) throws Exception, Throwable {
		// create factory
		ArchiveStreamFactory factory = new ArchiveStreamFactory();
		// set entryEncoding
		factory.setEntryEncoding(encoding);
		if ("gz".equals(extension) || "tar".equals(extension)) {
			return factory.createArchiveInputStream(ArchiveStreamFactory.TAR, new GZIPInputStream(new BufferedInputStream(fis)));
		} else if ("zip".equals(extension)) {
			return factory.createArchiveInputStream(ArchiveStreamFactory.ZIP, fis);
		} else if ("jar".equals(extension)) {
			return factory.createArchiveInputStream(ArchiveStreamFactory.JAR, fis);
		}
		return null;
	}

	public String getExtension(String path) {
		int index = path.lastIndexOf(".");
		if (index != -1) {
			return path.substring(index + 1, path.length()).toLowerCase();
		}
		return "";
	}

	private String getBasePath(String srcPath) {
		String basePath = srcPath;
		File srcFile = mkFile(srcPath);// mkFile
		if (srcFile.isFile()) {
			basePath = srcFile.getParent();
		} else {
			if (!basePath.endsWith("/")) {
				basePath += File.separator;
			}
		}
		return basePath;
	}

}
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    使用Java API进行tar.gz文件及文件夹压缩解压缩.docx

    ame()); tOut.putArchiveEntry(tarEntry);...通过引入该库,我们可以轻松地在 Java 程序中实现文件和文件夹的压缩与解压缩功能。在实际开发中,注意错误处理、资源管理以及安全性等方面,以确保程序的健壮性和安全性。

    java打包解压缩代码

    以下是一个简单的解压缩示例: ```java import java.io.*; import java.util.zip.*; public class JarUnpackager { public static void main(String[] args) { String jarFile = "myapp.jar"; // 需要解压的JAR...

    Java压缩解压缩工具类

    总结起来,`PressUtil`类提供了一个简洁的Java压缩解压缩工具,实现了对单个文件或文件夹的zip压缩功能。通过使用Java标准库的I/O和压缩API,这个工具类可以方便地集成到任何Java项目中,以处理文件的压缩和解压缩...

    使用ZLIB库压缩解压源码(支持多级文件目录)

    在这个过程中,还需要处理文件路径和属性信息,以便在解压缩时能够正确恢复文件结构。 3. **写入ZIP头信息**:为了创建标准的ZIP文件,我们需要在压缩数据前添加ZIP头信息。这包括中央目录记录、本地文件头和数据...

    javacore\heapdump文件分析工具

    本篇文章将详细讲解如何使用`javacore`和`heapdump`分析工具,特别是针对Websphere环境的`ha`和`jca`工具,以及如何使用JDK1.6来打开和解析这些文件。 首先,`javacore`文件是Java虚拟机(JVM)在遇到特定事件(如...

    《Java开发典型模块大全》光盘

    14. **文件操作**:文件的读写、压缩、解压缩等,使用Java IO或NIO API。 15. **XML和JSON处理**:解析和生成XML或JSON数据,可能涉及DOM、SAX、Jackson或Gson。 16. **图形用户界面(GUI)**:如Swing或JavaFX,...

    UNRAR 3.54 Source Code

    UNRAR 3.54是RAR文件解压缩工具的一个重要版本,其源代码的公开为开发者提供了深入了解RAR压缩算法和解压缩机制的机会。这篇文章将深入探讨这个版本的源代码,解析其中的关键技术和功能,并结合“控件”、“源码”、...

    MFT接口demo

    **MFT接口DEMO详解** ...通过这个DEMO,我们可以深入理解MFT的工作原理,同时掌握文件解压缩和非标准文件解析的技巧。这样的实践对于提升IT专业人士在文件系统管理和数据处理方面的技能非常有帮助。

    java 分页 处理

    下载的文件是一个包含文档和示例的web项目,解压缩后,将war包部署到Tomcat的WebApps目录下,启动Tomcat即可查看示例和文档。 2. **配置环境**:将`pager-taglib.jar`文件放入项目的lib目录,无需修改web.xml。部署...

    JasperReport与iReport的配置与使用[整理].pdf

    配置ANT_HOME环境变量,指向ant的解压缩目录,并在PATH中添加%ANT_HOME%\bin。配置成功后,命令行输入ant应显示其帮助信息。 2.3 JasperReport的安装与配置 JasperReport的安装主要是将下载的jar文件添加到项目类...

    hadoop安装记录

    4. **解压与配置**:解压缩Hadoop文件到指定目录,并根据系统情况进行配置,比如修改`etc/hadoop`下的配置文件。 5. **环境变量**:配置`HADOOP_HOME`、`PATH`等环境变量,确保Hadoop命令可以全局访问。 6. **文件...

    junrar

    至于标签中的“unrar”,它指的是任何用于处理RAR文件的工具或库,包括在命令行环境下直接使用的解压缩工具。而“java”则是指明我们的讨论范围是在Java语言中实现的相关功能。junrar正是这两大概念相结合的产物——...

    cms 基于java

    - 解压缩`jeecms-2012-src.zip`,获得源码文件。 - **第二步:创建Eclipse项目** - 在Eclipse中创建一个新的Java Web项目,例如命名为`jeecms`。 - **第三步:导入源码** - 将`src`文件夹复制到Eclipse项目的`src...

    jdk-14.0.1_windows-x64_bin.zip

    2. **解压**:使用任何支持zip格式的解压缩工具,如WinRAR或7-Zip,将压缩包解压到你希望安装JDK的目录。通常,开发者会选择一个不会频繁变动的位置,如"C:\Program Files"或"C:\Java"。 3. **安装**:双击解压后的...

    见附件 Desktop.zip

    1. **压缩与解压缩**:了解如何使用各种压缩工具(如7-Zip, WinRAR等)来创建、管理和提取ZIP格式的压缩包,以及压缩和解压缩的基本原理。 2. **源代码管理**:学习源码的组织结构,包括目录、文件命名规范,以及...

    随机抽奖的水果图像文件.zip

    用户可以使用解压软件(如WinRAR、7-Zip或macOS的内置工具)来解压缩这些文件。 接下来,我们关注到压缩包内的文件——一系列的".png"图像文件。PNG(Portable Network Graphics)是一种无损压缩的位图格式,支持...

    MyWorkText.rar

    用户需要使用解压缩工具(如WinRAR、7-Zip等)来访问这些内容。 【标签】为空,这意味着没有提供额外的分类信息,因此具体包含的文件类型和主题需要通过打开压缩包来查看。 【压缩包子文件的文件名称列表】:由于...

    mysql在windows下的安装配置.docx

    这个解压缩版无需安装过程,可以直接使用。 配置MySQL的关键在于修改配置文件`my.ini`。在这个文件中,有两个主要部分需要关注:`[client]`和`[mysqld]`。`[client]`部分用于配置MySQL客户端的设置,而`[mysqld]`...

    读取黑莓备份文件.ipd

    如果你是开发者,你可以使用编程语言如Python、Java或C#,结合开源库(如zlib用于解压缩,SQLite用于处理数据库文件)来构建自己的解决方案。基本步骤包括: 1. 解压缩`.ipd`文件:`.ipd`文件实际上是一个ZIP压缩...

    记事本软件

    解压缩这个文件后,可能会看到有关Java语法、实例代码、问题解决策略等内容的详细记录。 3. **mybase_nyfedit5** - 这看起来像是一个特定版本的个人信息管理系统或知识库软件的名称。MyBase是一款强大的个人信息...

Global site tag (gtag.js) - Google Analytics