JAVA实现压缩/解压缩zip文件
1.import java.io.BufferedInputStream; 2.import java.io.BufferedOutputStream; 3.import java.io.File; 4.import java.io.FileInputStream; 5.import java.io.FileOutputStream; 6.import java.io.IOException; 7.import java.io.InputStream; 8.import java.io.OutputStream; 9.import java.util.ArrayList; 10.import java.util.Enumeration; 11.import java.util.List; 12.import java.util.zip.ZipEntry; 13.import java.util.zip.ZipFile; 14.import java.util.zip.ZipOutputStream; 15. 16.public class ZipToFile { 17. 18. public static final String ZIP_FILENAME = "C:\\XJPDA.zip";//需要解压缩的文件名 19. public static final String ZIP_DIR = "C:\\XJPDA\\";//需要压缩的文件夹 20. public static final String UN_ZIP_DIR = "C:\\";//要解压的文件目录 21. public static final int BUFFER = 1024 ;//缓存大小 22. 23. /** 24. * zip压缩功能. 25. * 压缩baseDir(文件夹目录)下所有文件,包括子目录 26. * @throws Exception 27. */ 28. public static void zipFile(String baseDir,String fileName) throws Exception{ 29. List fileList=getSubFiles(new File(baseDir)); 30. ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName)); 31. ZipEntry ze=null; 32. byte[] buf=new byte[BUFFER]; 33. int readLen=0; 34. for(int i = 0; i <fileList.size(); i++) { 35. File f=(File)fileList.get(i); 36. ze=new ZipEntry(getAbsFileName(baseDir, f)); 37. ze.setSize(f.length()); 38. ze.setTime(f.lastModified()); 39. zos.putNextEntry(ze); 40. InputStream is=new BufferedInputStream(new FileInputStream(f)); 41. while ((readLen=is.read(buf, 0, BUFFER))!=-1) { 42. zos.write(buf, 0, readLen); 43. } 44. is.close(); 45. } 46. zos.close(); 47. } 48. 49. /** 50. * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径. 51. * @param baseDir java.lang.String 根目录 52. * @param realFileName java.io.File 实际的文件名 53. * @return 相对文件名 54. */ 55. private static String getAbsFileName(String baseDir, File realFileName){ 56. File real=realFileName; 57. File base=new File(baseDir); 58. String ret=real.getName(); 59. while (true) { 60. real=real.getParentFile(); 61. if(real==null) 62. break; 63. if(real.equals(base)) 64. break; 65. else 66. ret=real.getName()+"/"+ret; 67. } 68. return ret; 69. } 70. 71. /** 72. * 取得指定目录下的所有文件列表,包括子目录. 73. * @param baseDir File 指定的目录 74. * @return 包含java.io.File的List 75. */ 76. private static List getSubFiles(File baseDir){ 77. List ret=new ArrayList(); 78. File[] tmp=baseDir.listFiles(); 79. for (int i = 0; i <tmp.length; i++) { 80. if(tmp[i].isFile()) 81. ret.add(tmp[i]); 82. if(tmp[i].isDirectory()) 83. ret.addAll(getSubFiles(tmp[i])); 84. } 85. return ret; 86. } 87. 88. /** 89. * 解压缩功能. 90. * 将ZIP_FILENAME文件解压到ZIP_DIR目录下. 91. * @throws Exception 92. */ 93. public static void upZipFile() throws Exception{ 94. ZipFile zfile=new ZipFile(ZIP_FILENAME); 95. Enumeration zList=zfile.entries(); 96. ZipEntry ze=null; 97. byte[] buf=new byte[1024]; 98. while(zList.hasMoreElements()){ 99. ze=(ZipEntry)zList.nextElement(); 100. if(ze.isDirectory()){ 101. File f=new File(ZIP_DIR+ze.getName()); 102. f.mkdir(); 103. continue; 104. } 105. OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(ZIP_DIR, ze.getName()))); 106. InputStream is=new BufferedInputStream(zfile.getInputStream(ze)); 107. int readLen=0; 108. while ((readLen=is.read(buf, 0, 1024))!=-1) { 109. os.write(buf, 0, readLen); 110. } 111. is.close(); 112. os.close(); 113. } 114. zfile.close(); 115. } 116. 117. /** 118. * 给定根目录,返回一个相对路径所对应的实际文件名. 119. * @param baseDir 指定根目录 120. * @param absFileName 相对路径名,来自于ZipEntry中的name 121. * @return java.io.File 实际的文件 122. */ 123. public static File getRealFileName(String baseDir, String absFileName){ 124. String[] dirs=absFileName.split("/"); 125. File ret=new File(baseDir); 126. if(dirs.length>1){ 127. for (int i = 0; i < dirs.length-1;i++) { 128. ret=new File(ret, dirs[i]); 129. } 130. if(!ret.exists()) 131. ret.mkdirs(); 132. ret=new File(ret, dirs[dirs.length-1]); 133. return ret; 134. } 135. return ret; 136. } 137. 138.} import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipOutputStream;public class ZipToFile {public static final String ZIP_FILENAME= "C:\\XJPDA.zip";//需要解压缩的文件名public static final String ZIP_DIR = "C:\\XJPDA\\";//需要压缩的文件夹public static final String UN_ZIP_DIR = "C:\\";//要解压的文件目录public static final int BUFFER = 1024 ;//缓存大小/*** zip压缩功能.* 压缩baseDir(文件夹目录)下所有文件,包括子目录* @throws Exception*/public static void zipFile(String baseDir,String fileName) throws Exception{List fileList=getSubFiles(new File(baseDir));ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName));ZipEntry ze=null;byte[] buf=new byte[BUFFER];int readLen=0;for(int i = 0; i <fileList.size(); i++) {File f=(File)fileList.get(i);ze=new ZipEntry(getAbsFileName(baseDir, f));ze.setSize(f.length());ze.setTime(f.lastModified());zos.putNextEntry(ze);InputStream is=new BufferedInputStream(new FileInputStream(f));while ((readLen=is.read(buf, 0, BUFFER))!=-1) {zos.write(buf, 0, readLen);}is.close();}zos.close();}/*** 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.* @param baseDir java.lang.String 根目录* @param realFileName java.io.File 实际的文件名* @return 相对文件名*/private static String getAbsFileName(String baseDir, File realFileName){File real=realFileName;File base=new File(baseDir);String ret=real.getName();while (true) {real=real.getParentFile();if(real==null) break;if(real.equals(base)) break;elseret=real.getName()+"/"+ret;}return ret;}/*** 取得指定目录下的所有文件列表,包括子目录.* @param baseDir File 指定的目录* @return 包含java.io.File的List*/private static List getSubFiles(File baseDir){List ret=new ArrayList();File[] tmp=baseDir.listFiles();for (int i = 0; i <tmp.length; i++) {if(tmp[i].isFile())ret.add(tmp[i]);if(tmp[i].isDirectory())ret.addAll(getSubFiles(tmp[i]));}return ret;}/*** 解压缩功能.* 将ZIP_FILENAME文件解压到ZIP_DIR目录下.* @throws Exception*/public static void upZipFile() throws Exception{ZipFile zfile=new ZipFile(ZIP_FILENAME);Enumeration zList=zfile.entries();ZipEntry ze=null;byte[] buf=new byte[1024];while(zList.hasMoreElements()){ze=(ZipEntry)zList.nextElement();if(ze.isDirectory()){ File f=new File(ZIP_DIR+ze.getName()); f.mkdir();continue;}OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(ZIP_DIR, ze.getName())));InputStream is=new BufferedInputStream(zfile.getInputStream(ze));int readLen=0;while ((readLen=is.read(buf, 0, 1024))!=-1) {os.write(buf, 0, readLen);}is.close();os.close();}zfile.close();}/*** 给定根目录,返回一个相对路径所对应的实际文件名.* @param baseDir 指定根目录* @param absFileName 相对路径名,来自于ZipEntry中的name* @return java.io.File 实际的文件*/public static File getRealFileName(String baseDir, String absFileName){String[] dirs=absFileName.split("/");File ret=new File(baseDir);if(dirs.length>1){for (int i = 0; i < dirs.length-1;i++) {ret=new File(ret, dirs[i]);}if(!ret.exists())ret.mkdirs();ret=new File(ret, dirs[dirs.length-1]);return ret;}return ret;}}不过上面存在中文问题
是因为java.util.zip下的格式转换有问题
将
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
改成
import org.apache.tools.zip.*;
即可!
apache里修正了这一现象。
原文地址:http://orz.iteye.com/blog/110842