- 浏览: 38311 次
- 性别:
- 来自: 上海
文章分类
最新评论
package com.huaat.ccms.common.utils; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.List; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; import org.apache.commons.lang.StringUtils; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Zip文件工具类 * */ public class ZipUtils { static final int BUFFER = 8192; private static final String DEFAULT_FILE_ENCODING = "UTF-8"; private static Logger logger = LoggerFactory.getLogger(ZipUtils.class); private static String fileEncoding = System.getProperty("sun.jnu.encoding"); public static void compress(File zipFile, File srcFile) { try { FileOutputStream fileOutputStream = new FileOutputStream(zipFile); CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32()); ZipOutputStream out = new ZipOutputStream(cos); out.setEncoding(ZipUtils.fileEncoding); String basedir = ""; compress(srcFile, out, basedir); out.close(); } catch (Exception e) { throw new RuntimeException(e); } } private static void compress(File file, ZipOutputStream out, String basedir) { /* 判断是目录还是文件 */ if (file.isDirectory()) { compressDirectory(file, out, basedir); } else { compressFile(file, out, basedir); } } /** 压缩一个目录 ,不带外层文件夹 */ public static void compressDirectoryNoBaseDir(File dir, File basedir) { try { FileOutputStream fileOutputStream = new FileOutputStream(dir); CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32()); ZipOutputStream out = new ZipOutputStream(cos); out.setEncoding(ZipUtils.fileEncoding); if (!basedir.exists()) return; File[] files = basedir.listFiles(); for (int i = 0; i < files.length; i++) { /* 递归 */ compress(files[i], out, ""); } out.close(); } catch (Exception e) { throw new RuntimeException(e); } } /** 压缩一个目录 */ private static void compressDirectory(File dir, ZipOutputStream out, String basedir) { if (!dir.exists()) return; File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { /* 递归 */ compress(files[i], out, basedir + dir.getName() + File.separator); } } /** 压缩一个文件 */ private static void compressFile(File file, ZipOutputStream out, String basedir) { if (!file.exists()) { return; } try { BufferedInputStream bis = new BufferedInputStream( new FileInputStream(file)); ZipEntry entry = new ZipEntry(basedir + file.getName()); out.putNextEntry(entry); int count; byte data[] = new byte[BUFFER]; while ((count = bis.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } bis.close(); } catch (Exception e) { throw new RuntimeException(e); } } @SuppressWarnings("unchecked") public static void unZip(File inFile, String desDir) throws IOException { int i = inFile.getName().lastIndexOf('.'); File newdir = new File(desDir); boolean bool = newdir.mkdirs(); logMkDir(bool); byte[] c = new byte[1024]; int slen; ZipFile zf = new ZipFile(inFile,ZipUtils.fileEncoding); Enumeration enu = zf.getEntries(); while (enu.hasMoreElements()) { ZipEntry file = (ZipEntry) enu.nextElement(); i = file.getName().replace('/', '\\').lastIndexOf('\\'); if (i != -1) { File dirs = new File(desDir + File.separator + file.getName().replace('/', '\\').substring(0, i)); dirs.mkdirs(); dirs = null; } if (!file.isDirectory()) { InputStream fi = zf.getInputStream(file); if (fi != null) { FileOutputStream out = new FileOutputStream(desDir + File.separator + file.getName()); while ((slen = fi.read(c, 0, c.length)) != -1) { out.write(c, 0, slen); } out.close(); fi.close(); } } } zf.close(); } private static void logMkDir(boolean bool) { if(bool==false){ logger.error("建立解压文件夹失败"); } } @SuppressWarnings("unchecked") public static void unZipForUtf8(File inFile, String desDir, String suffix) throws IOException { String[] suffixs = suffix.split(","); List sufList = Arrays.asList(suffixs); int i = inFile.getName().lastIndexOf('.'); File newdir = new File(desDir); boolean bool = newdir.mkdirs(); logMkDir(bool); byte[] c = new byte[1024]; int slen; ZipFile zf = new ZipFile(inFile,ZipUtils.fileEncoding); Enumeration enu = zf.getEntries(); while (enu.hasMoreElements()) { ZipEntry file = (ZipEntry) enu.nextElement(); i = file.getName().replace('/', '\\').lastIndexOf('\\'); if (i != -1) { File dirs = new File(desDir + File.separator + file.getName().replace('/', '\\').substring(0, i)); dirs.mkdirs(); dirs = null; } if (!file.isDirectory()) { String fileName = file.getName(); String[] fileNames = fileName.split("\\."); String fileSuffix = fileNames[fileNames.length - 1] .toLowerCase(); InputStream fi = zf.getInputStream(file); if (sufList.contains(fileSuffix)) { String temp; // StringBuffer fileStr = new StringBuffer(); // 转编码 if (fi != null) { String encoding = new ConvertEncoding() .getFileCharacter(fi); fi = zf.getInputStream(file); BufferedReader br = new BufferedReader( new InputStreamReader( fi, StringUtils.isEmpty(encoding) ? DEFAULT_FILE_ENCODING : encoding)); BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(new FileOutputStream( desDir + File.separator + file.getName()), "UTF-8")); while ((temp = br.readLine()) != null) { bw.write(temp); } if (br != null) { bw.close(); br.close(); } } } else { if (fi != null) { FileOutputStream out = new FileOutputStream(desDir + File.separator + file.getName()); while ((slen = fi.read(c, 0, c.length)) != -1) { out.write(c, 0, slen); } out.close(); fi.close(); } } } } zf.close(); } public static void zip(File inDir, File desFile) throws IOException { byte[] buf = new byte[1024]; ZipOutputStream out = new ZipOutputStream(new FileOutputStream(desFile)); List<String> list = new ArrayList<String>(); list(list, inDir.getAbsolutePath()); for (String element : list) { File file = new File(element); if (file.isFile()) { FileInputStream in = new FileInputStream(file); String path = file.getAbsolutePath(); int index = path.indexOf(inDir.getName()) + inDir.getName().length() + 1; if (index > path.length() - 1) index = path.length() - 1; path = path.substring(index, path.length()); out.putNextEntry(new ZipEntry(path)); int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } out.closeEntry(); in.close(); } } out.close(); } public static void zip(File inDir, OutputStream os) throws IOException { byte[] buf = new byte[1024]; ZipOutputStream out = new ZipOutputStream(os); List<String> list = new ArrayList<String>(); list(list, inDir.getAbsolutePath()); for (String element : list) { File file = new File(element); if (file.isFile()) { FileInputStream in = new FileInputStream(file); String path = file.getAbsolutePath(); int index = path.indexOf(inDir.getName()) + inDir.getName().length() + 1; path = path.substring(index, path.length()); out.putNextEntry(new ZipEntry(path)); int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } out.closeEntry(); in.close(); } } out.close(); } public static void list(List<String> lst, String path) { File f = new File(path); if (f.isDirectory()) { lst.add(f.getAbsolutePath() + File.separator); String dirs[] = f.list(); for (int i = 0; dirs != null && i < dirs.length; i++) { list(lst, f.getAbsolutePath() + File.separator + dirs[i]); } } if (f.isFile()) { lst.add(f.getAbsolutePath()); } } }
如题:
相关推荐
zipEntry.setComment("压缩文件"); // 可以添加注释,同样需要指定字符集 zos.putNextEntry(zipEntry); try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) { byte[] buffer...
解决 Java 压缩文件乱码问题可以通过使用 Apache 的开源类库 ZipOutputStream 和 ZipEntry,设置编码方式为 gbk,使用 setEncoding 方法设置压缩文件的注释编码方式为 gbk,从而解决中文乱码问题。
然而,当压缩文件包含中文字符时,解压缩过程中可能会遇到乱码问题。这是因为编码格式不匹配或者处理方式不当导致的。本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 ...
解决java压缩zip文件时的中文乱码问题 ...实现:java压缩文件成zip实现无乱码。 包括:写好的工具类与jar包。 使用方法:导入ant.jar包,调用CompressExcelOperate中的方法,即可实现压缩文件,并保证没有中文乱码。
总结来说,Java中实现HUFFMAN压缩文件涉及到字符频率统计、HUFFMAN树构建、编码字典生成以及编码/解码文件等步骤。通过熟练掌握这些技术,开发者可以创建高效的文件压缩工具,有效节省存储空间,提高数据传输效率。
以上代码片段展示了如何利用Apache Commons IO库来处理中文乱码问题,使得在Java中进行ZIP文件的压缩和解压更加便捷和准确。在实际开发中,根据项目需求,可以选择使用标准库或者Apache Commons IO库,确保文件名和...
Java作为一种广泛使用的编程语言,也提供了实现视频压缩的能力。本篇将详细探讨如何使用Java来实现视频压缩,以及涉及到的相关知识点。 首先,我们要理解视频压缩的基本原理。视频是由一帧一帧的静态图像(图片)...
总的来说,解决Java压缩中文乱码问题的关键在于正确处理文件名的编码,确保使用UTF-8编码,并在必要时自定义压缩和解压缩流。通过上述方法,即使不依赖第三方库,也可以在Java程序中实现对中文文件名的完美支持。
2、指定文件夹(文件夹中必须有一个文件),程序会自动的压缩文件为 zip,然后下载删除源文件与压缩文件。 3、可以指定文件都为最后生成为zip文件下载,且删除源文件。 1、压缩文件或者目录(只是压缩不删除):...
`ZipOutputStream`是Java标准库中的一个类,它继承自`FilterOutputStream`,用于创建ZIP格式的压缩文件。当我们使用这个类进行文件压缩时,可能会遇到乱码问题,主要是因为编码设置不当导致的。下面我们将详细探讨...
在Java编程语言中实现算术编码,可以帮助我们理解这种压缩方法,并将其应用于实际项目,如大作业的需求。以下是关于算术压缩算法及其Java实现的详细讲解。 算术编码的基本原理: 1. **概率模型**:在压缩前,对输入...
本项目聚焦于使用Java实现大文件,尤其是视频的分片上传,并在服务器端进行合并与压缩处理。以下是相关知识点的详细介绍: 1. **前端分片上传**: - **WebUploader**:这是一款基于JavaScript的前端文件上传组件,...
在Java编程中,处理压缩文件是一项常见的任务,尤其是在文件传输、数据存储或打包代码资源时。然而,当涉及中文字符时,可能会遇到一些问题。这个问题通常与编码格式有关,因为不同的编码方式对非ASCII字符(如中文...
哈夫曼编码是一种高效的数据编码方法,主要用于无损数据压缩,尤其在文本文件的压缩中表现出色。这种编码方式基于频率最小的字符用最短的二进制代码表示的原理,能够有效地减少数据存储和传输时的位数,从而达到压缩...
java 压缩目录中的所有文件 中文文件名不会乱码
### Java压缩文件代码详解:基于Zip格式的文件压缩技术 #### 概述 在Java编程中,处理文件压缩是一项常见的需求,特别是在数据传输、存储优化或归档管理方面。Java标准库提供了强大的压缩功能,其中最常用的是基于...
在IT行业中,文件压缩是一种常见的数据存储和传输方式,ZipOutputStream是Java标准库中的一个类,用于将数据流写入ZIP格式的压缩文件。本文将深入探讨如何使用ZipOutputStream进行文件压缩,并解决可能出现的乱码...
在Java中,可以使用`Charset`类来指定正确的字符集,例如`StandardCharsets.UTF_8`,确保读写操作都使用UTF-8编码,这可以有效避免中文乱码问题。 3. **压缩文件**: 使用`ZipOutputStream`,可以将文件添加到ZIP...