`

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实现文件下载并解决中文文件名乱码

    本文将详细介绍如何使用Java实现文件下载功能,并重点讲解如何解决中文文件名乱码的问题。 #### 一、基本原理与步骤 1. **读取文件**:首先需要将要下载的文件读取到内存中。 2. **设置响应头**:为了正确地告知...

    java压缩zip文件中文乱码问题解决方法

    Java在处理包含中文字符的压缩文件时,可能会遇到中文乱码的问题。这主要涉及两个方面:内容的中文乱码和压缩文件注释的中文乱码。以下是对这两个问题的详细解释以及解决方法。 1. 内容的中文乱码问题: 当Java...

    java编码转换介绍文档

    Java编程中,编码问题时常出现,例如在处理中文字符时可能出现乱码。为了解决这些问题,Java提供了一个名为`native2ascii`的工具,该工具能够帮助我们将不同编码的文本文件转换成Java能正确识别的Unicode编码。 1. ...

    linux技术文档

    - 在 XMMS 的首选项中,勾选“禁用ID3V2标签”,避免中文乱码问题。 - **选择字体**: - 播放清单: - `-sony-*-*-*-*-*-16-*-*-*-*-*-iso8859-1,-*-*-*-*-*-*-16-*-*-*-*-*-gbk-0` - 主窗口: - `-sony-*-*-*-...

    J2EE学习教程

    - J2EE(Java 2 Platform, Enterprise Edition)是Sun Microsystems公司发布的一套企业级Java平台标准。 - 它旨在为多层中间件提供一个标准的、基于组件的开发与部署环境,简化了开发复杂分布式系统的任务。 2. *...

    native2ascii简介

    `native2ascii` 是Sun Java SDK中的一个实用工具,主要用于将包含非ASCII字符的文本文件(如`.txt`、`.ini`、`.properties`、`.java`等)转换为Unicode编码格式。在软件开发过程中,特别是在处理国际化(i18n)需求...

Global site tag (gtag.js) - Google Analytics