首页 > 学院 > 开发设计 > 正文

Apache Commons Compress

2019-11-11 07:49:29
字体:
来源:转载
供稿:网友

       Apache Commons是Apache软件基金会的项目,曾隶属于Jakarta项目。Commons的目的是提供可重用的、开源的java代码。Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。

ComPRess

       本例主要介绍组件Compress,Compress是ApacheCommons提供压缩、解压缩文件的类库,可以操作ar, cpio, Unix dump, tar, zip,gzip, XZ, Pack200 and bzip2格式的文件,功能比较强大。本例主要演示Compress操作对zip文件压缩与解压缩的操作。commons-compress-1.13-bin.zip 下载!

1、文件压缩成zip格式压缩包

         /**	 * 将文件打包成zip压缩包文件	 */	private static void compressFiles2Zip(){		long startInt = System.currentTimeMillis();		File file1 = new File("D://logs//log4j.log");		File file2 = new File("D://logs//log4j.log.2016-07-31-19");				List<File> files = new ArrayList<File>();		files.add(file1);		files.add(file2);		File zipFile = new File("D://logs//log4j.log.zip");		InputStream inputStream = null;		ZipArchiveOutputStream zipArchiveOutputStream = null;		try {			zipArchiveOutputStream = new ZipArchiveOutputStream(zipFile);			zipArchiveOutputStream.setUseZip64(Zip64Mode.AsNeeded);			for(File file : files){				//将每个文件用ZipArchiveEntry封装,使用ZipArchiveOutputStream写到压缩文件				ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(file, "test"+File.separator+file.getName());				zipArchiveOutputStream.putArchiveEntry(zipArchiveEntry);								inputStream = new FileInputStream(file);				byte[] buffer = new byte[1024 * 5]; 				int len = -1;				while((len = inputStream.read(buffer)) != -1) {					//把缓冲区的字节写入到ZipArchiveEntry					zipArchiveOutputStream.write(buffer, 0, len);				}			}			zipArchiveOutputStream.closeArchiveEntry();			zipArchiveOutputStream.finish();		} catch (IOException e) {//			e.printStackTrace();		}finally{			//关闭输入流			if(null!=inputStream){				try {					inputStream.close();				} catch (IOException e) {//					e.printStackTrace();				}			}			//关闭输出流			if(null!=zipArchiveOutputStream){				try {					zipArchiveOutputStream.close();				} catch (IOException e) {//					e.printStackTrace();				}			}		}		System.out.println("耗时:"+(System.currentTimeMillis()-startInt)+"毫秒");	}

2、zip压缩包解压成文件到指定文件夹

        /**	 * 将zip压缩包解压成文件到指定文件夹	 */	private static void decompressZip2Files(){		long startInt = System.currentTimeMillis();		String zipFilePath = "D://logs//log4j.log.zip";		File zipFile = new File(zipFilePath);		InputStream inputStream = null;		OutputStream outputStream = null;		//zip文件输入流		ZipArchiveInputStream zipArchiveInputStream = null;		ArchiveEntry archiveEntry = null;		try {			inputStream = new FileInputStream(new File(zipFilePath));			zipArchiveInputStream = new ZipArchiveInputStream(inputStream,"UTF-8");			while(null!=(archiveEntry = zipArchiveInputStream.getNextEntry())){				//获取文件名				String archiveEntryFileName = archiveEntry.getName();				//构造解压后文件的存放路径				String archiveEntryPath = "D://logs//test//" + archiveEntryFileName;				byte[] content = new byte[(int) archiveEntry.getSize()];				zipArchiveInputStream.read(content);				//把解压出来的文件写到指定路径				File entryFile  = new File(archiveEntryPath);				if(!entryFile.exists()){					entryFile.getParentFile().mkdirs();				}				outputStream = new FileOutputStream(entryFile);				outputStream.write(content);				outputStream.flush();			}		} catch (FileNotFoundException e) {//			e.printStackTrace();		} catch (IOException e) {//			e.printStackTrace();		}finally{			if(null!=outputStream){				try {					outputStream.close();				} catch (IOException e) {//					e.printStackTrace();				}			}			if(null!=zipArchiveInputStream){				try {					zipArchiveInputStream.close();				} catch (IOException e) {//					e.printStackTrace();				}			}			if(null!=inputStream){				try {					inputStream.close();				} catch (IOException e) {//					e.printStackTrace();				}			}		}		System.out.println("耗时:"+(System.currentTimeMillis()-startInt)+"毫秒");	}

       以上分别演示zip文件压缩和解压缩的过程,以下将zip文件压缩和解压缩抽取成公共方法,但是其中未添加文件格式校验等操作,需要读者自行补充。

package com.mahaochen.apache.commons.Compress;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.io.OutputStream;import org.apache.commons.compress.archivers.ArchiveEntry;import org.apache.commons.compress.archivers.zip.Zip64Mode;import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;public class CommCompressZipFileUtil {	/**	 * 将文件打包成zip压缩包文件	 * @param files	 * @param targetFilePath	 * @return	 */	public boolean compressFiles2Zip(File[] files,String targetFilePath){				InputStream inputStream = null;		ZipArchiveOutputStream zipArchiveOutputStream = null;		try {			File zipFile = new File(targetFilePath);			zipArchiveOutputStream = new ZipArchiveOutputStream(zipFile);			//Use Zip64 extensions for all entries where they are required			zipArchiveOutputStream.setUseZip64(Zip64Mode.AsNeeded);			for(File file : files){				//将每个文件用ZipArchiveEntry封装,使用ZipArchiveOutputStream写到压缩文件				ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(file, file.getName());				zipArchiveOutputStream.putArchiveEntry(zipArchiveEntry);								inputStream = new FileInputStream(file);				byte[] buffer = new byte[1024 * 5]; 				int len = -1;				while((len = inputStream.read(buffer)) != -1) {					//把缓冲区的字节写入到ZipArchiveEntry					zipArchiveOutputStream.write(buffer, 0, len);				}			}			zipArchiveOutputStream.closeArchiveEntry();			zipArchiveOutputStream.finish();		} catch (IOException e) {//			e.printStackTrace();			return false;		}finally{			//关闭输入流			if(null!=inputStream){				try {					inputStream.close();				} catch (IOException e) {//					e.printStackTrace();				}			}			//关闭输出流			if(null!=zipArchiveOutputStream){				try {					zipArchiveOutputStream.close();				} catch (IOException e) {//					e.printStackTrace();				}			}		}		return true;	}		/**	 * 将zip压缩包解压成文件到指定文件夹	 * @param zipFilePath	 * @param targetDirPath	 * @return	 */	public boolean decompressZip2Files(String zipFilePath,String targetDirPath){				InputStream inputStream = null;		OutputStream outputStream = null;		//zip文件输入流		ZipArchiveInputStream zipArchiveInputStream = null;		ArchiveEntry archiveEntry = null;		try {			File zipFile = new File(zipFilePath);			inputStream = new FileInputStream(zipFile);			zipArchiveInputStream = new ZipArchiveInputStream(inputStream,"UTF-8");						while(null!=(archiveEntry = zipArchiveInputStream.getNextEntry())){				//获取文件名				String archiveEntryFileName = archiveEntry.getName();				//构造解压后文件的存放路径				String archiveEntryPath = targetDirPath + archiveEntryFileName;				//把解压出来的文件写到指定路径				File entryFile  = new File(archiveEntryPath);				if(!entryFile.exists()){					entryFile.getParentFile().mkdirs();				}				byte[] buffer = new byte[1024 * 5];				outputStream = new FileOutputStream(entryFile);				int len = -1;				while((len = zipArchiveInputStream.read(buffer)) != -1){					outputStream.write(buffer,0,len);				}				outputStream.flush();			}		} catch (FileNotFoundException e) {//			e.printStackTrace();			return false;		} catch (IOException e) {//			e.printStackTrace();			return false;		}finally{			if(null!=outputStream){				try {					outputStream.close();				} catch (IOException e) {//					e.printStackTrace();				}			}			if(null!=zipArchiveInputStream){				try {					zipArchiveInputStream.close();				} catch (IOException e) {//					e.printStackTrace();				}			}			if(null!=inputStream){				try {					inputStream.close();				} catch (IOException e) {//					e.printStackTrace();				}			}		}		return true;	}}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表