java解压zip中文乱码,java压缩文件乱码问题
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
第一种使用蚂蚁实现的活力解压缩,其中解压的乱码注意使用
公共void解压缩(字符串解压缩文件名,字符串输出路径)其中
这个。ZipFile=new ZipFile(解压文件名, GB 18030 );是解决中文名乱码的关键。
导入Java。io。*;
导入org。阿帕奇。工具。拉链。*;
导入Java。util。枚举;
/**
*p
* b功能:zip压缩、解压(支持中文文件名)/b
*p
* 说明:使用阿帕奇蚂蚁提供的活力工具org.apache.tools.zip实现活力压缩和解压功能。
* 解决了由于java.util.zip包不支持汉字的问题。
*
* @作者张力
* @修改器弗农。郑
*/
公共类AntZip {
私有ZipFile zipFile
私有ZipOutputStream zipOut//压缩活力
私有ZipEntry zipEntry
私有静态int bufSize//字节的大小
私有字节[]buf;
私有int readedBytes
//用于压缩中。要去除的绝对父路路径,目的是将绝对路径变成相对路径。
私有字符串deleteAbsoluteParent
/**
*构造方法。默认缓冲区大小为512字节。
*/
public AntZip() {
这个(512);
}
/**
*构造方法。
*
* @param bufSize
* 指定压缩或解压时的缓冲区大小
*/
public AntZip(int bufSize) {
this.bufSize=bufSize
this.buf=新字节【这个。bufsize];
deleteAbsoluteParent=null
}
/**
*压缩文件夹内的所有文件和目录。
*
* @param zipDirectory
* 需要压缩的文件夹名
*/
public void doZip(字符串Zip目录){
文件zipDir=新文件(zip目录);
doZip(新文件[] { zipDir },zipDir。getname());
}
/**
*压缩多个文件或目录。可以指定多个单独的文件或目录。而codedoZip(字符串zip directory)/代码
* 则直接压缩整个文件夹。
*
* @param文件
* 要压缩的文件或目录组成的代码文件/代码数组。
*@param zipFileName
* 压缩后的活力文件名,如果后缀不是。拉链,自动添加后缀。零封。
*/
public void doZip(File[] files,String zipFileName) {
//未指定压缩文件名,默认为压缩文件
if(zip文件名==null zip文件名。等于(“”)
zipFileName= ZipFile
//添加。"零"后缀
如果(!zipFileName.endsWith( .zip ))
zipFileName= .zip ;
尝试{
这个。zipout=新ZipOutputStream(新BufferedOutputStream(
新文件输出流(zip文件名)));
compressFiles(files,this.zipOut,true);
这个。zipout。close();
} catch (IOException ioe) {
ioe。printstacktrace();
}
}
/**
*压缩文件和目录。由doZip()调用
*
* @param文件
* 要压缩的文件
*@param zipOut
* zip输出流
*@param isAbsolute
* 是否是要去除的绝对路径的根路径。因为压缩文件()
* 会递归地被调用,所以只用deleteAbsoluteParent不行。必须用绝对的来指明
*压缩文件()是第一次调用,而不是后续的递归调用。即如果要压缩的路径是
* E:\temp,那么第一次调用时,isAbsolute=true,则deleteAbsoluteParent会记录
* 要删除的路径就是E:\,当压缩子目录e:\ temp \文件夹时,isAbsolute=false,
* 再递归调用压缩文件()时,删除绝对父母仍然是E:\。从而保证了
* 将E:\temp及其子目录均正确地转化为相对目录。这样压缩才不会出错。不然绝对路径E:\也会被写入到压缩文件中去。
*/
私有void压缩文件(File[]files,ZipOutputStream zipOut,
布尔isAbsolute)引发IOException {
对于(文件文件:文件){
if (file==null)
继续;//空的文件对象
//删除绝对父路径
if (file.isAbsolute()) {
if (isAbsolute) {
deleteAbsoluteParent=file。获取父文件()。getAbsolutePath();
deleteabsoluteparant=appendSeparator(deleteabsoluteparant);
}
}否则
deleteAbsoluteParent=
if (file.isDirectory()) {//是目录
compressFolder(file,zipOut);
} else {//是文件
compressFile(file,zipOut);
}
}
}
/**
*压缩文件或空目录。由压缩文件()调用。
*
* @param文件
* 需要压缩的文件
*@param zipOut
* zip输出流
*/
公共void压缩文件(文件文件,ZipOutputStream zipOut)
引发IOException {
字符串文件名=文件。tostring();
/* 去除绝对父路径。 */
if (file.isAbsolute())
文件名=文件名。substring(deleteabsoluteparant。length());
如果(文件名==空文件名== )
返回;
/*
* 因为是空目录,所以要在结尾加一个/。不然就会被当作是空文件拉链入口。com .的isDirectory()方法中,目录以/结尾。
*组织。阿帕奇。工具。拉链。zip条目:公共布尔值是directory(){ return
* getName().endsWith(/);}
*/
if (file.isDirectory())
fileName=fileName /;//此处不能用\\
zipOut.putNextEntry(新的ZipEntry(文件名));
//如果是文件则需读;如果是空目录则无需读,直接转到zipOut.closeEntry()。
if (file.isFile()) {
file inputstream fileIn=新文件inputstream(file);
而((这个。readedbytes=文件输入。看(这个。buf))0){
zipOut.write(this.buf,0,this。读取的字节);
}
归档。close();
}
zipout。关闭条目();
}
/**
*递归完成目录文件读取。由压缩文件()调用。
*
* @param dir
* 需要处理的文件对象
*@param zipOut
* zip输出流
*/
私有void compressFolder(文件目录,zipOutput流拉上拉链)
引发IOException {
文件[]文件=目录。列出文件();
if (files.length==0)//如果目录为空,则单独压缩空目录。
compressFile(dir,zipOut);
其他
//如果目录不为空,则分别处理目录和文件。
compressFiles(files,zipOut,false);
}
/**
*解压指定活力文件。
*
* @param unZipFileName
* 需要解压的活力文件名
*/
公共void解压缩(字符串unZipFileName) {
文件输出流文件输出
文件文件;
输入流输入流;
尝试{
this.zipFile=新的zip文件(unzipfile);
for(枚举条目=this。zip文件。getentries();进入。hasMoreElements();) {
zip entry entry=(zip entry)条目。next element();
文件=新文件(条目。getname());
if (entry.isDirectory()) {//是目录,则创建之
文件。mkdirs();
} else {//是文件
//如果指定文件的父目录不存在,则创建之。
文件父代=文件。获取父文件();
如果(家长!=null!parent.exists()) {
父母。mkdirs();
}
inputStream=zip文件。getinputstream(entry);
fileOut=新文件输出流(文件);
而((这个。readedbytes=inputstream。看(这个。buf))0){
fileOut.write(this.buf,0,this。读取的字节);
}
退出文件。close();
输入流。close();
}
}
这个。zip文件。close();
} catch (IOException ioe) {
ioe。printstacktrace();
}
}
/**
*解压指定活力文件。其中GB18030 解决中文乱码
*
* @param unZipFileName
* 需要解压的活力文件名
* @param outputPath
* 输出路径
*/
public void unZip(String unZip filename,String outputPath) {
文件输出流文件输出
文件文件;
输入流输入流;
尝试{
这个。ZipFile=new ZipFile(解压文件名, GB 18030 );
for(枚举条目=this。zip文件。getentries();进入。hasMoreElements();) {
zip entry entry=(zip entry)条目。next element();
File=新文件(输出路径条目。getname());
if (entry.isDirectory()) {//是目录,则创建之
文件。mkdirs();
} else {//是文件
//如果指定文件的父目录不存在,则创建之。
文件父代=文件。获取父文件();
如果(家长!=null!parent.exists()) {
父母。mkdirs();
}
inputStream=zip文件。getinputstream(entry);
fileOut=新文件输出流(文件);
而((这个。readedbytes=inputstream。看(这个。buf))0){
fileOut.write(this.buf,0,this。读取的字节);
}
退出文件。close();
输入流。close();
}
}
这个。zip文件。close();
} catch (IOException ioe) {
ioe。printstacktrace();
}
}
/**
*给文件路径或目录结尾添加文件。分隔符
*
* @param文件名
* 需要添加路径分割符的路径
* @返回如果路径已经有分割符,则原样返回,否则添加分割符后返回。
*/
私有字符串appendSeparator(字符串路径){
如果(!path.endsWith(File.separator))
path=File.separator
返回路径;
}
/**
*解压指定活力文件。
*
* @param unZipFile
* 需要解压的活力文件对象
*/
公共void解压缩(文件解压缩文件){
解压(解压文件。tostring());
}
/**
*设置压缩或解压时缓冲区大小。
*
* @param bufSize
* 缓冲区大小
*/
public void setBufSize(int bufSize){
this.bufSize=bufSize
}
//主函数,用于测试AntZip类
/*
*公共静态void main(String[] args)引发异常{
* if(参数。length=2){ AntZip zip zip=new AntZip();
*
* if(args[0]).等于(-zip ){//将后续参数全部转化为文件对象文件[]文件=新文件[
*参数。长度-1];for(int I=0;我赞成。长度-1;i ){文件=新的
* File(args[I 1]);}
*
* //将第一个文件名作为活力文件名zip.doZip(文件,文件[0])。getName());
*
*退货;} else if(args[0].等于(-unzip ){ zip。unzip(args[1]);返回
* ;} }
*
* System.out.println(用法:);
* System.out.println(压缩:Java AntZip-zip[目录名文件名]. );
* System.out.println(解压:Java AntZip-unzip文件名。zip’);}
*/
}第二种从修改ZipInputStream及压缩输出流对於档名的编码方式来着手了。
我们可以从爪哇岛开发工具包的src.zip取得ZipInputStream及压缩输出流的原始码来加以修改:
一、ZipOutputStream.java
1.从爪哇岛开发工具包的src.zip取得ZipOutputStream.java原始码,另存新档存到c:/java/util/zip这个资料夹里,档名改为CZipOutputStream.java。
2.开始修改原始码,将班级名称改为CZipOutputStream
3.建构式也必须更改为CZipOutputStream
4.新增成员,这个成员记录编码方式
私有字符串编码=‘UTF八号’;
5.再新增一个建构式(这个建构式可以让这个班级在新的的时候,设定档名的编码)
公共CZipOutputStream(输出流输出,字符串编码){
超级(出,新平减器(平减器. DEFAULT_COMPRESSION,true));
usesdefaultdefacterier=true
编码=编码
}推荐:java基础教程以上就是爪哇岛中解压乱码解决方法的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。