Java 压缩类库的使用

Java压缩类库的使用-1.总述

压缩是编程中常见的技巧,多用于大文件压缩,数据流压缩等。在Java类库中,内置了jar、ZIP、GZIP、ZLIB等的支持(见java.util.zip、java.util.jar包)。另外在Apache项目下Ant中ant.jar的org.apache.tools.tar、org.apache.tools.zip、org.apache.tools.bzip2分别提供了tar、zip、bzip2的支持;Apache commons compress项目里提供了对AR、BZIP、CPIO、GZP、TAR、ZIP的支持。7-zip提供了LZMA格式的压缩(public domain),QuickLZ提供了quicklz格式的压缩(GPL),oberhumer.com提供LZO格式的压缩(GPL),hadoop-gpl-compression则对LZO的c实现用JNI进行包装,提供更快捷的LZO压缩。

  严格来说,TAR、AR、CPIO并不属于压缩软件,而是一种打包软件,它能把很多文件、文件夹打包成一个文件,供压缩程序压缩。而咱们在windows中熟悉的zip、rar,严格的说是具备打包和压缩功能的一种格式。

      因为本人在项目中需主要需要应用压缩工具对网络中传输的数据流进行压缩,因此重点关心对Stream的压缩,而不关心对多个文件的压缩,这在代码中也会有所体现。因此,本系列的代码一般仅适用于压缩流或压缩一个文件。

  LZMA、QuickLZ、LZO因为提供的类库不支持stream形式压缩或提供的example太难看懂,故不作测试。这里还有一个需要提醒,Apache commons compress的tar、zip、bzip2来最初源于ant,但经过项目间迁移、演化,API及性能有所不同。

  所有的格式均提供压缩和解压两个方法,再次提醒这里所有代码不适用于压缩多个文件、文件夹。下面是抽象的压缩、加压缩类:

package study.inkfish.compress;
import java.io.File;
import java.io.IOException;
public abstract class Compress {
	public void compress(File srcFile, File destFile) {
		destFile.getParentFile().mkdirs();
		try {
			doCompress(srcFile, destFile);
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}
	public void decompress(File srcFile, File destDir) {
		destDir.mkdirs();
		try {
			doDecompress(srcFile, destDir);
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}
	protected int bufferLen = 1024 * 1024;//buffer size: 1MByte
	protected abstract void doCompress(File srcFile, File destFile) throws IOException;
	protected abstract void doDecompress(File srcFile, File destDir) throws IOException;
}

Java压缩类库的使用-2.JDK中的打包、压缩类库

package study.inkfish.compress;
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.zip.DeflaterOutputStream;
import java.util.zip.InflaterInputStream;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;

/** JDK ZLIB压缩: */
public class JdkZLIBCompress extends Compress {
	@Override
	protected void doCompress(File srcFile, File destFile) throws IOException {
		OutputStream out = null;
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(srcFile), bufferLen);
			out = new DeflaterOutputStream(new BufferedOutputStream(new FileOutputStream(destFile), bufferLen));
			IOUtils.copy(is, out);
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(out);
		}
	}
	@Override
	protected void doDecompress(File srcFile, File destDir) throws IOException {
		InputStream is = null;
		OutputStream os = null;
		try {
			File destFile = new File(destDir, FilenameUtils.getBaseName(srcFile.toString()));
			is = new InflaterInputStream(new BufferedInputStream(new FileInputStream(srcFile), bufferLen));
			os = new BufferedOutputStream(new FileOutputStream(destFile), bufferLen);
			IOUtils.copy(is, os);
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(os);
		}
	}
}
JDK ZIP压缩(仅适用于压缩一个文件):
package study.inkfish.compress;
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.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import org.apache.commons.io.IOUtils;
public class JdkZipCompress extends Compress {
	@Override
	protected void doCompress(File srcFile, File destFile) throws IOException {
		ZipOutputStream zout = null;
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(srcFile), bufferLen);
			zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(destFile), bufferLen));
			zout.putNextEntry(new ZipEntry(srcFile.getName()));
			IOUtils.copy(is, zout);
			zout.closeEntry();
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(zout);
		}
	}
	@Override
	protected void doDecompress(File srcFile, File destDir) throws IOException {
		ZipInputStream is = null;
		try {
			is = new ZipInputStream(new BufferedInputStream(new FileInputStream(srcFile), bufferLen));
			ZipEntry entry = null;
			while ((entry = is.getNextEntry()) != null) {
				if (entry.isDirectory()) {
					File directory = new File(destDir, entry.getName());
					directory.mkdirs();
					is.closeEntry();
				} else {
					OutputStream os = null;
					try {
						os = new BufferedOutputStream(
								new FileOutputStream(new File(destDir, entry.getName())), bufferLen);
						IOUtils.copy(is, os);
					} finally {
						IOUtils.closeQuietly(os);
					}
					is.closeEntry();
				}
			}
		} finally {
			IOUtils.closeQuietly(is);
		}
	}
}

JDK GZIP压缩:

package study.inkfish.compress;
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.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
public class JdkGZIPCompress extends Compress {
	@Override
	protected void doCompress(File srcFile, File destFile) throws IOException {
		OutputStream out = null;
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(srcFile), bufferLen);
			out = new GZIPOutputStream(new BufferedOutputStream(new FileOutputStream(destFile), bufferLen));
			IOUtils.copy(is, out);
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(out);
		}
	}
	@Override
	protected void doDecompress(File srcFile, File destDir) throws IOException {
		InputStream is = null;
		OutputStream os = null;
		try {
			File destFile = new File(destDir, FilenameUtils.getBaseName(srcFile.toString()));
			is = new GZIPInputStream(new BufferedInputStream(new FileInputStream(srcFile), bufferLen));
			os = new BufferedOutputStream(new FileOutputStream(destFile), bufferLen);
			IOUtils.copy(is, os);
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(os);
		}
	}
}
注:org.apache.commons.io包为Apache common io,项目首页: http://commons.apache.org/io/,提供了IO操作的很多方便的方法,基于Apache 2.0 License,可用于商业用途。


Java压缩类库的使用-3.Apache Ant中的打包、压缩类库

这里需要关注的是BZIP2格式,经过测试,总是无法正确压缩,原因未知,而apache commons bzip2格式的文件压缩正常。Ant ZIP压缩:

Ant ZIP压缩:

package study.inkfish.compress;
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.commons.io.IOUtils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
public class AntZipCompress extends Compress {
	@Override
	protected void doCompress(File srcFile, File destFile) throws IOException {
		ZipOutputStream zout = null;
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(srcFile), bufferLen);
			zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(destFile), bufferLen));
			zout.putNextEntry(new ZipEntry(srcFile.getName()));
			IOUtils.copy(is, zout);
			zout.closeEntry();
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(zout);
		}
	}
	@Override
	protected void doDecompress(File srcFile, File destDir) throws IOException {
		ZipFile zipFile = new ZipFile(srcFile);
		try {
			@SuppressWarnings("unchecked")
			Enumeration<ZipEntry> enums = zipFile.getEntries();
			while (enums.hasMoreElements()) {
				ZipEntry entry = enums.nextElement();
				InputStream is = new BufferedInputStream(zipFile.getInputStream(entry), bufferLen);
				OutputStream os = null;
				try {
					os = new BufferedOutputStream(new FileOutputStream(new File(destDir, entry.getName())), bufferLen);
					IOUtils.copy(is, os);
				} finally {
					IOUtils.closeQuietly(is);
					IOUtils.closeQuietly(os);
				}
			}
		} finally {
			ZipFile.closeQuietly(zipFile);
		}
	}
}

Ant BZIP压缩:

package study.inkfish.compress;
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 org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.tools.bzip2.CBZip2InputStream;
import org.apache.tools.bzip2.CBZip2OutputStream;
public class AntBzip2Compress extends Compress {
	/**运行异常,无法正确打开*/
	@Override
	protected void doCompress(File srcFile, File destFile) throws IOException {
		OutputStream out = null;
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(srcFile), bufferLen);
			out = new CBZip2OutputStream(new BufferedOutputStream(new FileOutputStream(destFile), bufferLen));
			IOUtils.copy(is, out);
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(out);
		}
	}
	@Override
	protected void doDecompress(File srcFile, File destDir) throws IOException {
		InputStream is = null;
		OutputStream os = null;
		try {
			File destFile = new File(destDir, FilenameUtils.getBaseName(srcFile.toString()));
			is = new CBZip2InputStream(new BufferedInputStream(new FileInputStream(srcFile), bufferLen));
			os = new BufferedOutputStream(new FileOutputStream(destFile), bufferLen);
			IOUtils.copy(is, os);
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(os);
		}
	}
}

Ant TAR打包:

package study.inkfish.compress;
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 org.apache.commons.io.IOUtils;
import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarInputStream;
import org.apache.tools.tar.TarOutputStream;
public class AntTarCompress extends Compress {
	@Override
	protected void doCompress(File srcFile, File destFile) throws IOException {
		TarOutputStream out = null;
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(srcFile), bufferLen);
			out = new TarOutputStream(new BufferedOutputStream(new FileOutputStream(destFile), bufferLen));
			TarEntry entry = new TarEntry(srcFile.getName());
			entry.setSize(srcFile.length());
			out.putNextEntry(entry);
			IOUtils.copy(is, out);
			out.closeEntry();
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(out);
		}
	}
	@Override
	protected void doDecompress(File srcFile, File destDir) throws IOException {
		TarInputStream is = null;
		try {
			is = new TarInputStream(new BufferedInputStream(new FileInputStream(srcFile), bufferLen));
			TarEntry entry = null;
			while ((entry = is.getNextEntry()) != null) {
				if (entry.isDirectory()) {
					File directory = new File(destDir, entry.getName());
					directory.mkdirs();
				} else {
					BufferedOutputStream bos = null;
					try {
						byte[] buffer = new byte[1024 * 512];//512k buffer
						bos = new BufferedOutputStream(new FileOutputStream(
								new File(destDir, entry.getName())), buffer.length);
						int len;
						long size = entry.getSize();
						while (size > 0) {
							if (size < buffer.length) {
								len = is.read(buffer, 0, (int) size);
								size -= len;
							} else {
								len = is.read(buffer);
								size -= len;
							}
							bos.write(buffer, 0, len);
						}
					} finally {
						IOUtils.closeQuietly(bos);
					}
				}
			}
		} finally {
			IOUtils.closeQuietly(is);
		}
	}
}

Java压缩类库的使用-4.Apache commons compress中的打包、压缩类库

Apache commons compress BZIP2压缩:

package study.inkfish.compress;
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 org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
public class CommonsBZip2Compress extends Compress {
	@Override
	protected void doCompress(File srcFile, File destFile) throws IOException {
		OutputStream out = null;
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(srcFile), bufferLen);
			out = new GzipCompressorOutputStream(new BufferedOutputStream(new FileOutputStream(destFile), bufferLen));
			IOUtils.copy(is, out);
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(out);
		}
	}
	@Override
	protected void doDecompress(File srcFile, File destDir) throws IOException {
		InputStream is = null;
		OutputStream os = null;
		try {
			File destFile = new File(destDir, FilenameUtils.getBaseName(srcFile.toString()));
			is = new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(srcFile), bufferLen));
			os = new BufferedOutputStream(new FileOutputStream(destFile), bufferLen);
			IOUtils.copy(is, os);
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(os);
		}
	}
}

Apache commons compress GZIP压缩:

package study.inkfish.compress;
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 org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
public class CommonsGZIPCompress extends Compress {
	@Override
	protected void doCompress(File srcFile, File destFile) throws IOException {
		OutputStream out = null;
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(srcFile), bufferLen);
			out = new BZip2CompressorOutputStream(new BufferedOutputStream(new FileOutputStream(destFile), bufferLen));
			IOUtils.copy(is, out);
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(out);
		}
	}
	@Override
	protected void doDecompress(File srcFile, File destDir) throws IOException {
		InputStream is = null;
		OutputStream os = null;
		try {
			File destFile = new File(destDir, FilenameUtils.getBaseName(srcFile.toString()));
			is = new BZip2CompressorInputStream(new BufferedInputStream(new FileInputStream(srcFile), bufferLen));
			os = new BufferedOutputStream(new FileOutputStream(destFile), bufferLen);
			IOUtils.copy(is, os);
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(os);
		}
	}
}

Apache commons compress ZIP压缩:

package study.inkfish.compress;
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 org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.io.IOUtils;
public class CommonsZipCompress extends Compress {
	/**用于单文件压缩*/
	@Override
	protected void doCompress(File srcFile, File destFile) throws IOException {
		ZipArchiveOutputStream out = null;
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(srcFile), bufferLen);
			out = new ZipArchiveOutputStream(new BufferedOutputStream(new FileOutputStream(destFile), bufferLen));
			ZipArchiveEntry entry = new ZipArchiveEntry(srcFile.getName());
			entry.setSize(srcFile.length());
			out.putArchiveEntry(entry);
			IOUtils.copy(is, out);
			out.closeArchiveEntry();
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(out);
		}
	}
	@Override
	protected void doDecompress(File srcFile, File destDir) throws IOException {
		ZipArchiveInputStream is = null;
		try {
			is = new ZipArchiveInputStream(new BufferedInputStream(new FileInputStream(srcFile), bufferLen));
			ZipArchiveEntry entry = null;
			while ((entry = is.getNextZipEntry()) != null) {
				if (entry.isDirectory()) {
					File directory = new File(destDir, entry.getName());
					directory.mkdirs();
				} else {
					OutputStream os = null;
					try {
						os = new BufferedOutputStream(
								new FileOutputStream(new File(destDir, entry.getName())), bufferLen);
						IOUtils.copy(is, os);
					} finally {
						IOUtils.closeQuietly(os);
					}
				}
			}
		} finally {
			IOUtils.closeQuietly(is);
		}
	}
}

Apache commons compress AR打包:

package study.inkfish.compress;
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 org.apache.commons.compress.archivers.ar.ArArchiveEntry;
import org.apache.commons.compress.archivers.ar.ArArchiveInputStream;
import org.apache.commons.compress.archivers.ar.ArArchiveOutputStream;
import org.apache.commons.io.IOUtils;
public class CommonsArCompress extends Compress {
	@Override
	protected void doCompress(File srcFile, File destFile) throws IOException {
		ArArchiveOutputStream zout = null;
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(srcFile), bufferLen);
			zout = new ArArchiveOutputStream(new BufferedOutputStream(new FileOutputStream(destFile), bufferLen));
			zout.putArchiveEntry(new ArArchiveEntry(srcFile, srcFile.getName()));
			IOUtils.copy(is, zout);
			zout.closeArchiveEntry();
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(zout);
		}
	}
	@Override
	protected void doDecompress(File srcFile, File destDir) throws IOException {
		ArArchiveInputStream is = null;
		try {
			is = new ArArchiveInputStream(new BufferedInputStream(new FileInputStream(srcFile), bufferLen));
			ArArchiveEntry entry = null;
			while ((entry = is.getNextArEntry()) != null) {
				if (entry.isDirectory()) {
					File directory = new File(destDir, entry.getName());
					directory.mkdirs();
				} else {
					BufferedOutputStream bos = null;
					try {
						byte[] buffer = new byte[bufferLen];
						bos = new BufferedOutputStream(new FileOutputStream(
								new File(destDir, entry.getName())), bufferLen);
						int len;
						long size = entry.getSize();
						while (size > 0) {
							if (size < bufferLen) {
								len = is.read(buffer, 0, (int) size);
								size -= len;
							} else {
								len = is.read(buffer);
								size -= len;
							}
							bos.write(buffer, 0, len);
						}
					} finally {
						IOUtils.closeQuietly(bos);
					}
				}
			}
		} finally {
			IOUtils.closeQuietly(is);
		}
	}
}

Apache commons compress CPIO打包:

package study.inkfish.compress;
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 org.apache.commons.compress.archivers.cpio.CpioArchiveEntry;
import org.apache.commons.compress.archivers.cpio.CpioArchiveInputStream;
import org.apache.commons.compress.archivers.cpio.CpioArchiveOutputStream;
import org.apache.commons.io.IOUtils;
public class CommonsCPIOCompress extends Compress {
	@Override
	protected void doCompress(File srcFile, File destFile) throws IOException {
		CpioArchiveOutputStream out = null;
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(srcFile), bufferLen);
			out = new CpioArchiveOutputStream(new BufferedOutputStream(new FileOutputStream(destFile), bufferLen));
			out.putArchiveEntry(new CpioArchiveEntry(srcFile, srcFile.getName()));
			IOUtils.copy(is, out);
			out.closeArchiveEntry();
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(out);
		}
	}
	@Override
	protected void doDecompress(File srcFile, File destDir) throws IOException {
		CpioArchiveInputStream is = null;
		try {
			is = new CpioArchiveInputStream(new BufferedInputStream(new FileInputStream(srcFile), bufferLen));
			CpioArchiveEntry entry = null;
			while ((entry = is.getNextCPIOEntry()) != null) {
				if (entry.isDirectory()) {
					File directory = new File(destDir, entry.getName());
					directory.mkdirs();
				} else {
					BufferedOutputStream bos = null;
					try {
						byte[] buffer = new byte[bufferLen];
						bos = new BufferedOutputStream(new FileOutputStream(
								new File(destDir, entry.getName())), bufferLen);
						int len;
						long size = entry.getSize();
						while (size > 0) {
							if (size < bufferLen) {
								len = is.read(buffer, 0, (int) size);
								size -= len;
							} else {
								len = is.read(buffer);
								size -= len;
							}
							bos.write(buffer, 0, len);
						}
					} finally {
						IOUtils.closeQuietly(bos);
					}
				}
			}
		} finally {
			IOUtils.closeQuietly(is);
		}
	}
}

Apache commons compress TAR打包:

package study.inkfish.compress;
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 org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.io.IOUtils;
public class CommonsTarCompress extends Compress {
	@Override
	protected void doCompress(File srcFile, File destFile) throws IOException {
		TarArchiveOutputStream out = null;
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(srcFile), bufferLen);
			out = new TarArchiveOutputStream(new BufferedOutputStream(new FileOutputStream(destFile), bufferLen));
			TarArchiveEntry entry = new TarArchiveEntry(srcFile.getName());
			entry.setSize(srcFile.length());
			out.putArchiveEntry(entry);
			IOUtils.copy(is, out);
			out.closeArchiveEntry();
		} finally {
			IOUtils.closeQuietly(is);
			IOUtils.closeQuietly(out);
		}
	}
	@Override
	protected void doDecompress(File srcFile, File destDir) throws IOException {
		TarArchiveInputStream is = null;
		try {
			is = new TarArchiveInputStream(new BufferedInputStream(new FileInputStream(srcFile), bufferLen));
			TarArchiveEntry entry = null;
			while ((entry = is.getNextTarEntry()) != null) {
				if (entry.isDirectory()) {
					File directory = new File(destDir, entry.getName());
					directory.mkdirs();
				} else {
					BufferedOutputStream bos = null;
					try {
						byte[] buffer = new byte[bufferLen];
						bos = new BufferedOutputStream(new FileOutputStream(
								new File(destDir, entry.getName())), bufferLen);
						int len;
						long size = entry.getSize();
						while (size > 0) {
							if (size < bufferLen) {
								len = is.read(buffer, 0, (int) size);
								size -= len;
							} else {
								len = is.read(buffer);
								size -= len;
							}
							bos.write(buffer, 0, len);
						}
					} finally {
						IOUtils.closeQuietly(bos);
					}
				}
			}
		} finally {
			IOUtils.closeQuietly(is);
		}
	}
}


inkfish原创,请勿商业性质转载,转载请注明来源( http://blog.csdn.net/inkfish)。





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
package com.cliff.common; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; /** * * 类名: ZipUtil.java * 描述:压缩/解压缩zip包处理类 * 创建者:XXX * 创建日期:2015年5月7日 - 下午1:35:02 * 版本: V0.1 * 修改者: * 修改日期: */ public class ZipUtil { /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:35:18 * 版本: V0.1 * 修改者: * 修改日期: * @param directory 指定压缩文件路径 压缩到同目录 * @throws IOException * void */ public static void zip(String directory) throws FileNotFoundException, IOException { zip("", null, directory); } /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:36:03 * 版本: V0.1 * 修改者: * 修改日期: * @param zipFileName 压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名 * @param relativePath 相对路径,默认为空 * @param directory 文件或目录的绝对路径 * void */ public static void zip(String zipFileName, String relativePath, String directory) throws FileNotFoundException, IOException { String fileName = zipFileName; if (fileName == null || fileName.trim().equals("")) { File temp = new File(directory); if (temp.isDirectory()) { fileName = directory + ".zip"; } else { if (directory.indexOf(".") > 0) { fileName = directory.substring(0, directory.lastIndexOf("."))+ "zip"; } else { fileName = directory + ".zip"; } } } ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(fileName)); try { zip(zos, relativePath, directory); } catch (IOException ex) { throw ex; } finally { if (null != zos) { zos.close(); } } } /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:37:55 * 版本: V0.1 * 修改者: * 修改日期: * @param zos 压缩输出流 * @param relativePath 相对路径 * @param absolutPath 文件或文件夹绝对路径 * @throws IOException * void */ private static void zip(ZipOutputStream zos, String relativePath, String absolutPath) throws IOException { File file = new File(absolutPath); if (file.isDirectory()) { File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { File tempFile = files[i]; if (tempFile.isDirectory()) { String newRelativePath = relativePath + tempFile.getName() + File.separator; createZipNode(zos, newRelativePath); zip(zos, newRelativePath, tempFile.getPath()); } else { zipFile(zos, tempFile, relativePath); } } } else { zipFile(zos, file, relativePath); } } /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:38:46 * 版本: V0.1 * 修改者: * 修改日期: * @param zos 压缩输出流 * @param file 文件对象 * @param relativePath 相对路径 * @throws IOException * void */ private static void zipFile(ZipOutputStream zos, File file, String relativePath) throws IOException { ZipEntry entry = new ZipEntry(relativePath + file.getName()); zos.putNextEntry(entry); InputStream is = null; try { is = new FileInputStream(file); int BUFFERSIZE = 2 <= 0) { zos.write(buffer, 0, length); } zos.flush(); zos.closeEntry(); } catch (IOException ex) { throw ex; } finally { if (null != is) { is.close(); } } } /** * * 功能描述:创建目录 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:39:12 * 版本: V0.1 * 修改者: * 修改日期: * @param zos zip输出流 * @param relativePath 相对路径 * @throws IOException * void */ private static void createZipNode(ZipOutputStream zos, String relativePath) throws IOException { ZipEntry zipEntry = new ZipEntry(relativePath); zos.putNextEntry(zipEntry); zos.closeEntry(); } /** * * 功能描述:解压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:39:32 * 版本: V0.1 * 修改者: * 修改日期: * @param zipFilePath zip文件路径 * @param targetPath 解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下 * void */ public static void unzip(String zipFilePath, String targetPath) throws IOException { InputStream is = null; FileOutputStream fileOut = null; File file = null; ZipFile zipFile = null; try { zipFile = new ZipFile(zipFilePath,"GBK"); String directoryPath = ""; if (null == targetPath || "".equals(targetPath)) { directoryPath = zipFilePath.substring(0, zipFilePath.lastIndexOf(".")); } else { directoryPath = targetPath; } for(Enumeration entries = zipFile.getEntries(); entries.hasMoreElements();){ ZipEntry entry = (ZipEntry)entries.nextElement(); file = new File(directoryPath+"/"+entry.getName()); if(entry.isDirectory()){ file.mkdirs(); }else{ //如果指定文件的目录不存在,则创建之. File parent = file.getParentFile(); if(!parent.exists()){ parent.mkdirs(); } is = zipFile.getInputStream(entry); fileOut = new FileOutputStream(file); int readLen = 0; byte[] buffer = new byte[4096]; while ((readLen = is.read(buffer, 0, 4096)) >= 0) { fileOut.write(buffer, 0, readLen); } fileOut.close(); is.close(); } } zipFile.close(); } catch (IOException ex) { throw ex; } finally { if(null != zipFile){ zipFile = null; } if (null != is) { is.close(); } if (null != fileOut) { fileOut.close(); } } } /** * * 功能描述:生产文件 如果文件所在路径不存在则生成路径 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:41:04 * 版本: V0.1 * 修改者: * 修改日期: * @param fileName 文件名 带路径 * @param isDirectory 是否为路径 * @return * File */ 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(); target = new File(target.getAbsolutePath()); } } return target; } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值