`

java 压缩文件的编码问题

    博客分类:
  • Java
zip 
阅读更多
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());
		}
	}

}

 如题:

 

分享到:
评论

相关推荐

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

    zipEntry.setComment("压缩文件"); // 可以添加注释,同样需要指定字符集 zos.putNextEntry(zipEntry); try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) { byte[] buffer...

    如何解决java压缩文件乱码问题

    解决 Java 压缩文件乱码问题可以通过使用 Apache 的开源类库 ZipOutputStream 和 ZipEntry,设置编码方式为 gbk,使用 setEncoding 方法设置压缩文件的注释编码方式为 gbk,从而解决中文乱码问题。

    java android zip解压缩(解决压缩中文乱码问题)

    然而,当压缩文件包含中文字符时,解压缩过程中可能会遇到乱码问题。这是因为编码格式不匹配或者处理方式不当导致的。本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 ...

    解决java压缩zip文件时的中文乱码问题(包含jar包和工具类)

    解决java压缩zip文件时的中文乱码问题 ...实现:java压缩文件成zip实现无乱码。 包括:写好的工具类与jar包。 使用方法:导入ant.jar包,调用CompressExcelOperate中的方法,即可实现压缩文件,并保证没有中文乱码。

    JAVA压缩文件代码

    总结来说,Java中实现HUFFMAN压缩文件涉及到字符频率统计、HUFFMAN树构建、编码字典生成以及编码/解码文件等步骤。通过熟练掌握这些技术,开发者可以创建高效的文件压缩工具,有效节省存储空间,提高数据传输效率。

    java zip压缩解压工具解决中文乱码问题

    以上代码片段展示了如何利用Apache Commons IO库来处理中文乱码问题,使得在Java中进行ZIP文件的压缩和解压更加便捷和准确。在实际开发中,根据项目需求,可以选择使用标准库或者Apache Commons IO库,确保文件名和...

    java实现视频压缩

    Java作为一种广泛使用的编程语言,也提供了实现视频压缩的能力。本篇将详细探讨如何使用Java来实现视频压缩,以及涉及到的相关知识点。 首先,我们要理解视频压缩的基本原理。视频是由一帧一帧的静态图像(图片)...

    java解决压缩中文乱码

    总的来说,解决Java压缩中文乱码问题的关键在于正确处理文件名的编码,确保使用UTF-8编码,并在必要时自定义压缩和解压缩流。通过上述方法,即使不依赖第三方库,也可以在Java程序中实现对中文文件名的完美支持。

    java 下载文件 压缩且删除源文件(支持文件夹与文件)

    2、指定文件夹(文件夹中必须有一个文件),程序会自动的压缩文件为 zip,然后下载删除源文件与压缩文件。 3、可以指定文件都为最后生成为zip文件下载,且删除源文件。 1、压缩文件或者目录(只是压缩不删除):...

    用java对文件进行压缩并且解决乱码问题

    `ZipOutputStream`是Java标准库中的一个类,它继承自`FilterOutputStream`,用于创建ZIP格式的压缩文件。当我们使用这个类进行文件压缩时,可能会遇到乱码问题,主要是因为编码设置不当导致的。下面我们将详细探讨...

    算术算法压缩实现Java

    在Java编程语言中实现算术编码,可以帮助我们理解这种压缩方法,并将其应用于实际项目,如大作业的需求。以下是关于算术压缩算法及其Java实现的详细讲解。 算术编码的基本原理: 1. **概率模型**:在压缩前,对输入...

    java 大文件(视频)分片上传+压缩

    本项目聚焦于使用Java实现大文件,尤其是视频的分片上传,并在服务器端进行合并与压缩处理。以下是相关知识点的详细介绍: 1. **前端分片上传**: - **WebUploader**:这是一款基于JavaScript的前端文件上传组件,...

    java压缩文件,中文问题

    在Java编程中,处理压缩文件是一项常见的任务,尤其是在文件传输、数据存储或打包代码资源时。然而,当涉及中文字符时,可能会遇到一些问题。这个问题通常与编码格式有关,因为不同的编码方式对非ASCII字符(如中文...

    哈夫曼编码实现压缩解压缩java

    哈夫曼编码是一种高效的数据编码方法,主要用于无损数据压缩,尤其在文本文件的压缩中表现出色。这种编码方式基于频率最小的字符用最短的二进制代码表示的原理,能够有效地减少数据存储和传输时的位数,从而达到压缩...

    java 压缩目录中的所有文件 中文文件名不会乱码

    java 压缩目录中的所有文件 中文文件名不会乱码

    java压缩文件代码

    ### Java压缩文件代码详解:基于Zip格式的文件压缩技术 #### 概述 在Java编程中,处理文件压缩是一项常见的需求,特别是在数据传输、存储优化或归档管理方面。Java标准库提供了强大的压缩功能,其中最常用的是基于...

    ZipOutputStream 压缩文件以及乱码问题解决方案

    在IT行业中,文件压缩是一种常见的数据存储和传输方式,ZipOutputStream是Java标准库中的一个类,用于将数据流写入ZIP格式的压缩文件。本文将深入探讨如何使用ZipOutputStream进行文件压缩,并解决可能出现的乱码...

    java实现的文件解压和压缩,没有中文编码问题

    在Java中,可以使用`Charset`类来指定正确的字符集,例如`StandardCharsets.UTF_8`,确保读写操作都使用UTF-8编码,这可以有效避免中文乱码问题。 3. **压缩文件**: 使用`ZipOutputStream`,可以将文件添加到ZIP...

Global site tag (gtag.js) - Google Analytics