信息发布软件,b2b软件,广告发布软件
标题: JDK ZipEntry压缩中文文件名乱码解决和实例教程 [打印本页]
作者: 信息发布软件 时间: 2016-10-12 13:09
标题: JDK ZipEntry压缩中文文件名乱码解决和实例教程
摘要: 使用jdk自带的zip工具类Java.util.zip.ZipEntry,java.util.zip.ZipFile,java.util.zip.ZipInputStream,java.util.zip.ZipOutputStream 进行zip压缩时,没法解决文件名中文乱码问题 这里使用apac...
使用jdk自带的zip工具类Java.util.zip.ZipEntry,java.util.zip.ZipFile,java.util.zip.ZipInputStream,java.util.zip.ZipOutputStream 进行zip压缩时,没法解决文件名中文乱码问题
我使用maven 进行构建,pom配置如下:
Xml代码
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-compress</artifactId>
- <version>1.5</version>
- </dependency>
范例:
(1)压缩单个文件:
压缩D:\\Temp\\a\\password_密码.xls,压缩后的zip文件是d:\\Temp\\a\\a\\b\\c.zip
Java代码
- package com.jn.test;
-
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
-
- import org.apache.commons.compress.archivers.ArchiveException;
- import org.apache.commons.compress.archivers.ArchiveOutputStream;
- import org.apache.commons.compress.archivers.ArchiveStreamFactory;
- import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
- import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
- import org.junit.Test;
-
- import com.common.util.SystemUtil;
- import com.io.hw.file.util.FileUtils;
-
- public class ZIPTest {
-
- @Test
- public void test_01() {
- try {
- FileOutputStream fou = new FileOutputStream("d:\\Temp\\a\\a\\b\\c.zip");
- ArchiveOutputStream archOuts = new ArchiveStreamFactory()
- .createArchiveOutputStream(ArchiveStreamFactory.ZIP, fou);
- if(archOuts instanceof ZipArchiveOutputStream){
- ZipArchiveOutputStream zipOut=(ZipArchiveOutputStream)archOuts;
- String file="D:\\Temp\\a\\password_密码.xls";
- ZipArchiveEntry zipEntry=new ZipArchiveEntry(new File(file),SystemUtil.getFileSimpleName(file));
- zipOut.putArchiveEntry(zipEntry);
- zipOut.write(FileUtils.readBytes4file(file));
-
- zipOut.closeArchiveEntry();
- zipOut.flush();
- zipOut.finish();
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (ArchiveException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
运行之后会生成文件d:\\Temp\\a\\a\\b\\c.zip:
(1)压缩多个文件:
Java代码
- @Test
- public void test_02() {
- try {
- FileOutputStream fou = new FileOutputStream(
- "d:\\Temp\\a\\a\\b\\c.zip");
- ArchiveOutputStream archOuts = new ArchiveStreamFactory()
- .createArchiveOutputStream(ArchiveStreamFactory.ZIP, fou);
- if (archOuts instanceof ZipArchiveOutputStream) {
- ZipArchiveOutputStream zipOut = (ZipArchiveOutputStream) archOuts;
-
- String file01 = "D:\\Temp\\a\\password_密码.xls";
- ZipArchiveEntry zipEntry = new ZipArchiveEntry(
- new File(file01), SystemUtil.getFileSimpleName(file01));
- zipOut.putArchiveEntry(zipEntry);
- zipOut.write(FileUtils.readBytes4file(file01));
-
- String file02 = "D:\\Temp\\a\\ccc.jar";
- ZipArchiveEntry zipEntry2 = new ZipArchiveEntry(
- new File(file01), SystemUtil.getFileSimpleName(file02));
- zipOut.putArchiveEntry(zipEntry2);
- zipOut.write(FileUtils.readBytes4file(file02));
-
- zipOut.closeArchiveEntry();
- zipOut.flush();
- zipOut.finish();
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (ArchiveException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
压缩后的zip文件:
作者: 信息发布软件 时间: 2016-10-12 13:10
实例教程2
项目中碰到问题.jdk zipEntry 压缩中文文件名乱码
上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项.
第二种 就是拿来主义,因为 开源项目 Ant 里已经有现成的实现.把ant.jar 加入到 工程下的lib目录即可.
如果仅用到压缩,就加入ant.jar 就导致引入了一些不必要的文件,所以我找到Ant1.8的源码,然后只把需要的那一部分编译打包成了一个jar文件,供大家使用
首先引入
Java代码
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
关键示例代码如下:
Java代码
zos = new ZipOutputStream(new FileOutputStream(zipname));
FileInputStream fis = new FileInputStream(file);
ZipEntry ze = new ZipEntry(file.getName());
ze.setSize(file.length());
ze.setTime(file.lastModified());
zos.putNextEntry(ze); zos.setEncoding("gbk");
欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://postbbs.com/) |
Powered by Discuz! X3.2 |