欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

zip压缩解决文件名中文乱码问题(2) 博客分类: JavaJava Web zipzip压缩压缩zipapache中文文件名乱码 

程序员文章站 2024-02-24 16:56:40
...

使用apache旗下的commons-compress 压缩和解压zip文件

可以参考我的前一篇博客:http://hw1287789687.iteye.com/blog/1976309

以下是我封装的一个工具类,专门负责zip的压缩和解压 

CompressZipUtil:

package com.common.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.archivers.ArchiveOutputStream;
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
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 com.io.hw.file.util.FileUtils;
import com.string.widget.util.ValueWidget;
import com.swing.messagebox.GUIUtil23;

/***
 * use apache
 * commons-compress,http://www.cnblogs.com/un4sure/archive/2011/09/27/
 * 2193298.html,http://hw1287789687.iteye.com/blog/1976309
 * 
 * @author huangwei
 * @since 2013-11-18
 */
public final class CompressZipUtil {
	private CompressZipUtil() {
		throw new Error("Don't let anyone instantiate this class.");
	}

	/***
	 * 
	 * @param zipOut
	 * @param filepath
	 *            :要压缩的单个文件
	 * @throws IOException
	 */
	public static void addEntry(ZipArchiveOutputStream zipOut, String filepath)
			throws IOException {
		File singleFile = new File(filepath);
		if (singleFile.isDirectory()) {
			return;
		}
		ZipArchiveEntry zipEntry2 = new ZipArchiveEntry(singleFile,
				SystemUtil.getFileSimpleName(filepath));
		zipOut.putArchiveEntry(zipEntry2);
		FileInputStream fin = new FileInputStream(filepath);
		// 不要关闭zipOut,关闭之前要执行closeArchiveEntry()
		FileUtils.writeIn2Output(fin, zipOut, false, true);
	}

	/***
	 * 
	 * @param zipOut
	 * @param filepath
	 *            : 要压缩的单个文件
	 * @throws IOException
	 */
	public static void addEntry(ZipArchiveOutputStream zipOut, File filepath)
			throws IOException {
		if (filepath.isDirectory()) {
			return;
		}
		ZipArchiveEntry zipEntry2 = new ZipArchiveEntry(filepath,
				filepath.getName());
		zipOut.putArchiveEntry(zipEntry2);
		FileInputStream fin = new FileInputStream(filepath);
		// 不要关闭zipOut,关闭之前要执行closeArchiveEntry()
		FileUtils.writeIn2Output(fin, zipOut, false, true);
	}

	/***
	 * 
	 * @param zipOut
	 * @param filePaths
	 *            :要压缩的文件
	 * @throws IOException
	 */
	public static void compressZip(ZipArchiveOutputStream zipOut,
			@SuppressWarnings("rawtypes") List filePaths) throws IOException {

		for (Object fileObj : filePaths) {
			if (fileObj instanceof File) {
				File file = (File) fileObj;
				addEntry(zipOut, file);
			} else {
				addEntry(zipOut, (String) fileObj);
			}
		}
		zipOut.closeArchiveEntry();
		zipOut.flush();
		zipOut.finish();
		zipOut.close();
	}

	/***
	 * 压缩.
	 * 
	 * @param zipFile
	 *            :压缩的结果--zip文件
	 * @param filePaths
	 * @throws IOException
	 * @throws ArchiveException
	 */
	public static void compressZip(File zipFile,
			@SuppressWarnings("rawtypes") List filePaths) throws IOException,
			ArchiveException {
		FileOutputStream fou = new FileOutputStream(zipFile);
		ArchiveOutputStream archOuts = new ArchiveStreamFactory()
				.createArchiveOutputStream(ArchiveStreamFactory.ZIP, fou);
		if (archOuts instanceof ZipArchiveOutputStream) {
			ZipArchiveOutputStream zipOut = (ZipArchiveOutputStream) archOuts;
			compressZip(zipOut, filePaths);
		}
	}

	/***
	 * 
	 * @param zipFile
	 *            :压缩的结果--zip文件
	 * @param filePaths
	 * @throws IOException
	 * @throws ArchiveException
	 */
	public static void compressZip(String zipFile,
			@SuppressWarnings("rawtypes") List filePaths) throws IOException,
			ArchiveException {
		compressZip(new File(zipFile), filePaths);
	}

	/***
	 * compress single file.
	 * 
	 * @param zipFile
	 * @param filepath
	 *            :single file
	 * @throws IOException
	 * @throws ArchiveException
	 */
	public static void compressSingeFile(String zipFile, String filepath)
			throws IOException, ArchiveException {
		List filePaths = new ArrayList();
		filePaths.add(filepath);
		compressZip(zipFile, filePaths);
	}

	/***
	 * compress single file.
	 * 
	 * @param zipFile
	 * @param filepath
	 *            :single file
	 * @throws IOException
	 * @throws ArchiveException
	 */
	public static void compressSingeFile(String zipFile, File filepath)
			throws IOException, ArchiveException {
		List filePaths = new ArrayList();
		filePaths.add(filepath);
		compressZip(zipFile, filePaths);
	}

	/***
	 * 压缩指定文件夹中的所有文件.
	 * 
	 * @param zipFile
	 * @param folderPaths
	 * @throws IOException
	 * @throws ArchiveException
	 */
	public static void compressZip(String zipFile, String folderPaths)
			throws IOException, ArchiveException {
		List list = FileUtils.getListFiles(new File(folderPaths));
		compressZip(zipFile, list);
	}

	/***
	 * 压缩指定文件夹中的所有文件.
	 * 
	 * @param zipFile
	 * @param folderPaths
	 * @throws IOException
	 * @throws ArchiveException
	 */
	public static void compressZip(String zipFile, File folderPaths)
			throws IOException, ArchiveException {
		List list = FileUtils.getListFiles(folderPaths);
		compressZip(zipFile, list);
	}

	/***
	 * 解压zip
	 * 
	 * @param zipFile
	 * @param decompressLoc
	 *            :解压之后的文件所在目录
	 * @throws ArchiveException
	 * @throws IOException
	 */
	public static boolean decompress(String zipFile, File decompressLoc)
			throws ArchiveException, IOException {
		FileInputStream fin = new FileInputStream(zipFile);
		ArchiveInputStream archOuts = new ArchiveStreamFactory()
				.createArchiveInputStream(ArchiveStreamFactory.ZIP, fin);
		ZipArchiveInputStream zipIn = (ZipArchiveInputStream) archOuts;
		ZipArchiveEntry zipEntry;
		while (!ValueWidget.isNullOrEmpty(zipEntry = zipIn.getNextZipEntry())) {
			String fileName = zipEntry.getName();
			File singFile = new File(decompressLoc, fileName);
			if (singFile.exists()) {//若解压后的文件已经存在,则直接退出
				GUIUtil23.warningDialog("File \"" + singFile.getAbsolutePath()
						+ "\" does  exist.");
				zipIn.close();
//				break;
				return false;
			}
			System.out.println(fileName);
			FileUtils.writeIn2Output(zipIn, new FileOutputStream(singFile),
					true, false);
		}
		zipIn.close();
		return true;
	}

	/***
	 * 解压zip
	 * 
	 * @param zipFile
	 * @param decompressLoc
	 *            :解压之后的文件所在目录
	 * @throws ArchiveException
	 * @throws IOException
	 */
	public static boolean decompress(String zipFile, String decompressLocStr)
			throws ArchiveException, IOException {
		File decompressLoc = new File(decompressLocStr);
		return decompress(zipFile, decompressLoc);
	}

}

 附件:

(1)依赖的jar包 io0007-find_progess(包含源码)

(2)例子:目前只能压缩和解压一级目录的zip文件,zip_mgmt-0.0.1-SNAPSHOT.jar

执行方式 java -jar zip_mgmt-0.0.1-SNAPSHOT.jar:
zip压缩解决文件名中文乱码问题(2)
            
    
    博客分类: JavaJava Web zipzip压缩压缩zipapache中文文件名乱码 
 

  • zip压缩解决文件名中文乱码问题(2)
            
    
    博客分类: JavaJava Web zipzip压缩压缩zipapache中文文件名乱码 
  • 大小: 21.8 KB