经测试,文件名为中文的压缩完为乱码,测试过.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(); } } }