`
xumingrencai
  • 浏览: 1181354 次
文章分类
社区版块
存档分类
最新评论

JAVA实现压缩/解压缩zip文件

 
阅读更多

转载自:http://orz.iteye.com/blog/110842

Java代码收藏代码
  1. importjava.io.BufferedInputStream;
  2. importjava.io.BufferedOutputStream;
  3. importjava.io.File;
  4. importjava.io.FileInputStream;
  5. importjava.io.FileOutputStream;
  6. importjava.io.IOException;
  7. importjava.io.InputStream;
  8. importjava.io.OutputStream;
  9. importjava.util.ArrayList;
  10. importjava.util.Enumeration;
  11. importjava.util.List;
  12. importjava.util.zip.ZipEntry;
  13. importjava.util.zip.ZipFile;
  14. importjava.util.zip.ZipOutputStream;
  15. publicclassZipToFile{
  16. publicstaticfinalStringZIP_FILENAME="C:\\XJPDA.zip";//需要解压缩的文件名
  17. publicstaticfinalStringZIP_DIR="C:\\XJPDA\\";//需要压缩的文件夹
  18. publicstaticfinalStringUN_ZIP_DIR="C:\\";//要解压的文件目录
  19. publicstaticfinalintBUFFER=1024;//缓存大小
  20. /**
  21. *zip压缩功能.
  22. *压缩baseDir(文件夹目录)下所有文件,包括子目录
  23. *@throwsException
  24. */
  25. publicstaticvoidzipFile(StringbaseDir,StringfileName)throwsException{
  26. ListfileList=getSubFiles(newFile(baseDir));
  27. ZipOutputStreamzos=newZipOutputStream(newFileOutputStream(fileName));
  28. ZipEntryze=null;
  29. byte[]buf=newbyte[BUFFER];
  30. intreadLen=0;
  31. for(inti=0;i<fileList.size();i++){
  32. Filef=(File)fileList.get(i);
  33. ze=newZipEntry(getAbsFileName(baseDir,f));
  34. ze.setSize(f.length());
  35. ze.setTime(f.lastModified());
  36. zos.putNextEntry(ze);
  37. InputStreamis=newBufferedInputStream(newFileInputStream(f));
  38. while((readLen=is.read(buf,0,BUFFER))!=-1){
  39. zos.write(buf,0,readLen);
  40. }
  41. is.close();
  42. }
  43. zos.close();
  44. }
  45. /**
  46. *给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
  47. *@parambaseDirjava.lang.String根目录
  48. *@paramrealFileNamejava.io.File实际的文件名
  49. *@return相对文件名
  50. */
  51. privatestaticStringgetAbsFileName(StringbaseDir,FilerealFileName){
  52. Filereal=realFileName;
  53. Filebase=newFile(baseDir);
  54. Stringret=real.getName();
  55. while(true){
  56. real=real.getParentFile();
  57. if(real==null)
  58. break;
  59. if(real.equals(base))
  60. break;
  61. else
  62. ret=real.getName()+"/"+ret;
  63. }
  64. returnret;
  65. }
  66. /**
  67. *取得指定目录下的所有文件列表,包括子目录.
  68. *@parambaseDirFile指定的目录
  69. *@return包含java.io.File的List
  70. */
  71. privatestaticListgetSubFiles(FilebaseDir){
  72. Listret=newArrayList();
  73. File[]tmp=baseDir.listFiles();
  74. for(inti=0;i<tmp.length;i++){
  75. if(tmp[i].isFile())
  76. ret.add(tmp[i]);
  77. if(tmp[i].isDirectory())
  78. ret.addAll(getSubFiles(tmp[i]));
  79. }
  80. returnret;
  81. }
  82. /**
  83. *解压缩功能.
  84. *将ZIP_FILENAME文件解压到ZIP_DIR目录下.
  85. *@throwsException
  86. */
  87. publicstaticvoidupZipFile()throwsException{
  88. ZipFilezfile=newZipFile(ZIP_FILENAME);
  89. EnumerationzList=zfile.entries();
  90. ZipEntryze=null;
  91. byte[]buf=newbyte[1024];
  92. while(zList.hasMoreElements()){
  93. ze=(ZipEntry)zList.nextElement();
  94. if(ze.isDirectory()){
  95. Filef=newFile(ZIP_DIR+ze.getName());
  96. f.mkdir();
  97. continue;
  98. }
  99. OutputStreamos=newBufferedOutputStream(newFileOutputStream(getRealFileName(ZIP_DIR,ze.getName())));
  100. InputStreamis=newBufferedInputStream(zfile.getInputStream(ze));
  101. intreadLen=0;
  102. while((readLen=is.read(buf,0,1024))!=-1){
  103. os.write(buf,0,readLen);
  104. }
  105. is.close();
  106. os.close();
  107. }
  108. zfile.close();
  109. }
  110. /**
  111. *给定根目录,返回一个相对路径所对应的实际文件名.
  112. *@parambaseDir指定根目录
  113. *@paramabsFileName相对路径名,来自于ZipEntry中的name
  114. *@returnjava.io.File实际的文件
  115. */
  116. publicstaticFilegetRealFileName(StringbaseDir,StringabsFileName){
  117. String[]dirs=absFileName.split("/");
  118. Fileret=newFile(baseDir);
  119. if(dirs.length>1){
  120. for(inti=0;i<dirs.length-1;i++){
  121. ret=newFile(ret,dirs[i]);
  122. }
  123. if(!ret.exists())
  124. ret.mkdirs();
  125. ret=newFile(ret,dirs[dirs.length-1]);
  126. returnret;
  127. }
  128. returnret;
  129. }
  130. }


不过上面存在中文问题
是因为java.util.zip下的格式转换有问题

import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
改成
import org.apache.tools.zip.*;
即可!
apache里修正了这一现象。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics