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

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: