java压缩----使用sun JDK压缩--中文的文件名会是乱码

经测试,文件名为中文的压缩完为乱码,测试过.txt 的文件类型,中文内容可以正常显示。

所以这种方案不可行。

import java.io.File;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.FileUtils;
/**
 * @author  压缩指定的目录以及解压指定的压缩文件(仅限ZIP格式).
 */
	public class ZipUtils {

	    /**
		 * 将指定目录下的所有文件压缩并生成指定路径的压缩文件. 如果压缩文件的路径或父路径不存在, 将会自动创建.
		 * 
		 * @param src
		 *            将要进行压缩的目录
		 * @param zip
		 *            最终生成的压缩文件的路径
		 */
	    public static void zip(File src, File zip) throws IOException {
	        zip(src, FileUtils.openOutputStream(zip));
	    }

	    /**
		 * 将指定目录下的所有文件压缩并将流写入指定的输出流中.
		 * 
		 * @param src
		 *            将要进行压缩的目录
		 * @param out
		 *            用于接收压缩产生的文件流的输出流
		 */
	    public static void zip(File src, OutputStream out) throws IOException {
	        zip(src, new ZipOutputStream(out));
	    }

	    /**
		 * 将指定目录下的所有文件压缩并将流写入指定的ZIP输出流中.
		 * 
		 * @param src
		 *            将要进行压缩的目录
		 * @param zout
		 *            用于接收压缩产生的文件流的ZIP输出流
		 */
	    public static void zip(File src, ZipOutputStream zout) throws IOException {
	        try {
	            doZip(src, zout, "");
	        } finally {
	            IOUtils.closeQuietly(zout);
	        }
	    }

	    /**
		 * 将指定的压缩文件解压到指定的目标目录下. 如果指定的目标目录不存在或其父路径不存在, 将会自动创建.
		 * 
		 * @param zip
		 *            将会解压的压缩文件
		 * @param dest
		 *            解压操作的目录目录
		 */
	    public static void unzip(File zip, File dest) throws IOException {
	        unzip(FileUtils.openInputStream(zip), dest);
	    }

	    /**
		 * 将指定的输入流解压到指定的目标目录下.
		 * 
		 * @param in
		 *            将要解压的输入流
		 * @param dest
		 *            解压操作的目标目录
		 */
	    public static void unzip(InputStream in, File dest) throws IOException {
	        unzip(new ZipInputStream(in), dest);
	    }

	    /**
		 * 将指定的ZIP输入流解压到指定的目标目录下.
		 * 
		 * @param zin
		 *            将要解压的ZIP输入流
		 * @param dest
		 *            解压操作的目标目录
		 */
	    public static void unzip(ZipInputStream zin, File dest) throws IOException {
	        try {
	            doUnzip(zin, dest);
	        } finally {
	            IOUtils.closeQuietly(zin);
	        }
	    }

	    /**
		 * @param src 源文件目录或者文件
		 * @param zout 输出的流
		 * @param ns
		 */
	    private static void doZip(File src, ZipOutputStream zout, String ns)
	            throws IOException {
	        for (File file : src.listFiles()) {
	            String entryName = ns + file.getName();
	            if (file.isDirectory()) {
	                System.out.println("adding: {}"+entryName + "/");
	                zout.putNextEntry(new ZipEntry(entryName));
	                doZip(file, zout, entryName);
	            } else {
	                System.out.println("adding: {}"+ entryName);
	                zout.putNextEntry(new ZipEntry(entryName));
	                fillZip(FileUtils.openInputStream(file), zout);
	            }
	        }
	    }

	    /**
		 * @param zin
		 * @param dest
		 */
	    private static void doUnzip(ZipInputStream zin, File dest)
	            throws IOException {
	        for (ZipEntry e; (e = zin.getNextEntry()) != null; zin.closeEntry()) {
	            File file = new File(dest, e.getName());
	            if (e.isDirectory()) {
	                System.out.println(" creating: {}"+file.getName() + File.separator);
	                FileUtils.forceMkdir(file);
	            } else {
	                System.out.println("inflating: {}"+file);
	                flushZip(zin, FileUtils.openOutputStream(file));
	            }
	        }
	    }

	    /**
		 * @param in
		 * @param zout
		 */
	    private static void fillZip(InputStream in, ZipOutputStream zout)
	            throws IOException {
	        try {
	            IOUtils.copy(in, zout);
	        } finally {
	            IOUtils.closeQuietly(in);
	        }
	    }

	    /**
		 * @param zin
		 * @param out
		 */
	    private static void flushZip(ZipInputStream zin, OutputStream out)
	            throws IOException {
	        try {
	            IOUtils.copy(zin, out);
	        } finally {
	            IOUtils.closeQuietly(out);
	        }
	    }

	    /**
		 * 
		 */
	    private static Logger logger = LoggerFactory.getLogger(ZipUtils.class);
	    
	    public static void main(String[] args){
	    	try {
				ZipUtils.zip(new File("D:\\evidence\\20120712\\重生回到1997_2012071213114144\\言情小说吧_www.xs8.cn")
				, new File("D:\\evidence\\20120712\\重生回到1997_2012071213114144\\言情.zip"));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	    }
	} 

 

你可能感兴趣的:(java压缩)