用户登录
用户注册

分享至

apache ant zip.jar

  • 作者: 000猪都笑了
  • 来源: 51数据库
  • 2020-09-20
JDK中自带的ZipOutputStream在压缩文件时,如果文件名中有中文,则压缩后的
zip文件打开时发现中文文件名变成乱码.
解决的方法是使用apache-ant-zip.jar包(见附件)中的ZipOutputStream和ZipEntry.
即,导入类:
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
并且注意,压缩之前调用 ZipOutputStream的out.setEncoding(System.getProperty("sun.jnu.encoding")); 方法,
系统参数sun.jnu.encoding表示获取当前系统中的文件名的编码方式.这里将ZipOutputStream的文件名编码方式
设置成系统的文件名编码方式.
解压时,直接使用JDK原来的ZipInputStream即可.
但是有个 需要注意 的地方是,在读取ZIP文件之前,需要设置:
System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding"));
将系统的ZIP编码格式设置为系统文件名编码方式,否则解压时报异常.
(网上,还有修改ZipInputStream源码的方式貌似太麻烦了,参考:http://zwllxs.iteye.com/blog/871260)
ZIP代码参考http://szhnet.iteye.com/blog/199059,有修改.
package io;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

public class Zip
{
static final int BUFFER = 8192;

public Zip()
{

}

private static void compress(File file, ZipOutputStream out, String basedir)
{
/* 判断是目录还是文件 */
if (file.isDirectory())
{
// System.out.println("压缩:" + basedir + file.getName());
compressDirectory(file, out, basedir);
}
else
{
// System.out.println("压缩:" + basedir + file.getName());
compressFile(file, out, basedir);
}
}

/** 压缩一个目录 */
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()="" +="" "/");="" }="" }="" *="" 压缩一个文件="" */="" 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);="" }="" }="" public="" static="" void="" zip(string="" srcpathname,="" string="" zipfilename)="" {="" file="" file="new" file(srcpathname);="" file="" zipfile="new" file(zipfilename);="" if="" (!file.exists())="" throw="" new="" runtimeexception(srcpathname="" +="" "不存在!");="" try="" {="" fileoutputstream="" fileoutputstream="new" fileoutputstream(zipfile);="" checkedoutputstream="" cos="new" checkedoutputstream(fileoutputstream,="" new="" crc32());="" zipoutputstream="" out="new" zipoutputstream(cos);="" out.setencoding(system.getproperty("sun.jnu.encoding"));//设置文件名编码方式="" string="" basedir="" ;="" compress(file,="" out,="" basedir);="" out.close();="" }="" catch="" (exception="" e)="" {="" throw="" new="" runtimeexception(e);="" }="" }="" public="" static="" void="" main(string[]="" args)="" {="" zip.zip("d:\\d\\dll",="" "d:\\d\\dll.zip");="" }="" }="" unzip代码:="" package="" io;="" import="" java.io.file;="" import="" java.io.fileinputstream;="" import="" java.io.fileoutputstream;="" import="" java.io.ioexception;="" import="" java.util.zip.zipentry;="" import="" java.util.zip.zipinputstream;="" public="" class="" unzip="" {="" public="" static="" void="" unzip(string="" zipfilepath,="" string="" destdir)="" {="" system.setproperty("sun.zip.encoding",="" system.getproperty("sun.jnu.encoding"));="" 防止文件名中有中文时出错="" system.out.println(system.getproperty("sun.zip.encoding"));="" zip编码方式="" system.out.println(system.getproperty("sun.jnu.encoding"));="" 当前文件编码方式="" system.out.println(system.getproperty("file.encoding"));="" 这个是当前文件内容编码方式="" file="" dir="new" file(destdir);="" create="" output="" directory="" if="" it="" doesn't="" exist="" if="" (!dir.exists())="" dir.mkdirs();="" fileinputstream="" fis;="" buffer="" for="" read="" and="" write="" data="" to="" file="" byte[]="" buffer="new" byte[1024];="" try="" {="" fis="new" fileinputstream(zipfilepath);="" zipinputstream="" zis="new" zipinputstream(fis);="" zipentry="" ze="zis.getNextEntry();" while="" (ze="" !="null)" {="" string="" filename="ze.getName();" file="" newfile="new" file(destdir="" +="" file.separator="" +="" filename);="" system.out.println("unzipping="" to="" "="" +="" newfile.getabsolutepath());="" create="" directories="" for="" sub="" directories="" in="" zip="" new="" file(newfile.getparent()).mkdirs();="" fileoutputstream="" fos="new" fileoutputstream(newfile);="" int="" len;="" while="" ((len="zis.read(buffer))"> 0)
{
fos.write(buffer, 0, len);
}
fos.close();
// close this ZipEntry
zis.closeEntry();
ze = zis.getNextEntry();
}
// close last ZipEntry
zis.closeEntry();
zis.close();
fis.close();
}
catch (IOException e)
{
e.printStackTrace();
}

}

public static void main(String[] args)
{
String zipFilePath = "D:\\D\\dll.zip";

String destDir = "D:\\D\\dll_zip";

UnZip.unzip(zipFilePath, destDir);
}

}



  这个是字符集的问题,新建ZipEntry名称时用 new String(name.getBytes(), "utf-8")转换下字符集。
utf-8不行就用gbk。



  1.一般是软件程序解码错误。如浏览器把GBK码当成是Big5码显示,或电子邮件程序把对方传来的邮件错误解码。如果在发送时编码错误,收件者的电邮程序是不能解码的,需要寄件者的电邮程序重新编码再寄。
2.字体档案(font file)不对。
3.来源编码错误,或文件受到破坏。
4.一种语言版本的操作系统安装了另外一种语言版本的应用程序,或者应用程序安装的升级补丁的语言版本与应用程序原来安装的语言版本不一致。
5.早期单字节的应用程序在打开双字节语言的文件时不能正确识别文字的分割,在换行的地方把一个字从中分成两段,导致紧接在后面的整个一行全部都是乱码。
6.低版本的应用程序不能识别高版本的程序创建的文件。
7.由于TXD等修改文件出现内部冲突,一些修改游戏的MOD(modification)CLEO、IV补丁、真实补丁、技能补丁、升级补丁和CCI人物补丁等游戏修改软件的“Readme”“必看!”等阅读文件会出现乱码。



  把字符集转成UTF-8 就可以了。
软件
前端设计
程序设计
Java相关