Java 压缩 解压
    Java对zip的压缩文件进行解压有两个开源的工具包,一个是Apache的ant工具包,另一个就是Java api自带的工具包;但是Java自带的工具包存在问题:如果压缩或者解压的文件存在非英文字符(比如中文、以色列文),在操作的过程中会存在问题:MALFORMAL Eception……
    以下是通过Apache的zip工具包进行压缩和解压的代码(需要ant.jar):

    1. import java.io.File;
    2. import java.io.FileInputStream;
    3. import java.io.FileNotFoundException;
    4. import java.io.FileOutputStream;
    5. import java.io.IOException;
    6. import java.io.InputStream;
    7. import java.io.OutputStream;
    8. import java.util.ArrayList;
    9. import java.util.Enumeration;
    10. import java.util.List;
    11. import org.apache.tools.zip.ZipEntry;
    12. import org.apache.tools.zip.ZipFile;
    13. import org.apache.tools.zip.ZipOutputStream;
    14. /**
    15. * 压缩或解压zip:
    16. * 由于直接使用java.util.zip工具包下的类,会出现中文乱码问题,所以使用ant.jar中的org.apache.tools.zip下的工具类
    17. */
    18. public class ZipUtil {
    19. /**
    20. * 压缩文件或路径
    21. * @param zip 压缩的目的地址
    22. * @param srcFiles 压缩的源文件
    23. */
    24. public static void zipFile( String zip , List<File> srcFiles ){
    25. try {
    26. if( zip.endsWith(".zip") || zip.endsWith(".ZIP") ){
    27. ZipOutputStream _zipOut = new ZipOutputStream(new FileOutputStream(new File(zip))) ;
    28. _zipOut.setEncoding("GBK");
    29. for( File _f : srcFiles ){
    30. handlerFile(zip , _zipOut , _f , "");
    31. }
    32. _zipOut.close();
    33. }else{
    34. System.out.println("target file[" + zip + "] is not .zip type file");
    35. }
    36. } catch (FileNotFoundException e) {
    37. } catch (IOException e) {
    38. }
    39. }
    40. /**
    41. *
    42. * @param zip 压缩的目的地址
    43. * @param zipOut
    44. * @param srcFile 被压缩的文件信息
    45. * @param path 在zip中的相对路径
    46. * @throws IOException
    47. */
    48. private static void handlerFile(String zip , ZipOutputStream zipOut , File srcFile , String path ) throws IOException{
    49. System.out.println(" begin to compression file[" + srcFile.getName() + "]");
    50. if( !"".equals(path) && ! path.endsWith(File.separator)){
    51. path += File.separator ;
    52. }
    53. if( ! srcFile.getPath().equals(zip) ){
    54. if( srcFile.isDirectory() ){
    55. File[] _files = srcFile.listFiles() ;
    56. if( _files.length == 0 ){
    57. zipOut.putNextEntry(new ZipEntry( path + srcFile.getName() + File.separator));
    58. zipOut.closeEntry();
    59. }else{
    60. for( File _f : _files ){
    61. handlerFile( zip ,zipOut , _f , path + srcFile.getName() );
    62. }
    63. }
    64. }else{
    65. byte[] _byte = new byte[1024] ;
    66. InputStream _in = new FileInputStream(srcFile) ;
    67. zipOut.putNextEntry(new ZipEntry(path + srcFile.getName()));
    68. int len = 0 ;
    69. while( (len = _in.read(_byte)) > 0 ){
    70. zipOut.write(_byte, 0, len);
    71. }
    72. _in.close();
    73. zipOut.closeEntry();
    74. }
    75. }
    76. }
    77. /**
    78. * 解压缩ZIP文件,将ZIP文件里的内容解压到targetDIR目录下
    79. * @param zipPath 待解压缩的ZIP文件名
    80. * @param descDir 目标目录
    81. */
    82. public static List<File> upzipFile(String zipPath, String descDir) {
    83. return upzipFile( new File(zipPath) , descDir ) ;
    84. }
    85. /**
    86. * 对.zip文件进行解压缩
    87. * @param zipFile 解压缩文件
    88. * @param descDir 压缩的目标地址,如:D:\\测试 或 /mnt/d/测试
    89. * @return
    90. */
    91. @SuppressWarnings("rawtypes")
    92. public static List<File> upzipFile(File zipFile, String descDir) {
    93. List<File> _list = new ArrayList<File>() ;
    94. try {
    95. ZipFile _zipFile = new ZipFile(zipFile , "GBK") ;
    96. for( Enumeration entries = _zipFile.getEntries() ; entries.hasMoreElements() ; ){
    97. ZipEntry entry = (ZipEntry)entries.nextElement() ;
    98. File _file = new File(descDir + File.separator + entry.getName()) ;
    99. if( entry.isDirectory() ){
    100. _file.mkdirs() ;
    101. }else{
    102. byte[] _byte = new byte[1024] ;
    103. File _parent = _file.getParentFile() ;
    104. if( !_parent.exists() ){
    105. _parent.mkdirs() ;
    106. }
    107. InputStream _in = _zipFile.getInputStream(entry);
    108. OutputStream _out = new FileOutputStream(_file) ;
    109. int len = 0 ;
    110. while( (len = _in.read(_byte)) > 0){
    111. _out.write(_byte, 0, len);
    112. }
    113. _in.close();
    114. _out.flush();
    115. _out.close();
    116. _list.add(_file) ;
    117. }
    118. }
    119. } catch (IOException e) {
    120. }
    121. return _list ;
    122. }
    123. /**
    124. * 对临时生成的文件夹和文件夹下的文件进行删除
    125. */
    126. public static void deletefile(String delpath) {
    127. try {
    128. File file = new File(delpath);
    129. if (!file.isDirectory()) {
    130. file.delete();
    131. } else if (file.isDirectory()) {
    132. String[] filelist = file.list();
    133. for (int i = 0; i < filelist.length; i++) {
    134. File delfile = new File(delpath + File.separator + filelist[i]);
    135. if (!delfile.isDirectory()) {
    136. delfile.delete();
    137. } else if (delfile.isDirectory()) {
    138. deletefile(delpath + File.separator + filelist[i]);
    139. }
    140. }
    141. file.delete();
    142. }
    143. } catch (Exception e) {
    144. e.printStackTrace();
    145. }
    146. }
    147. public static void main(String[] args) {
    148. upzipFile("steven.zip","D://test");
    149. }
    150. }

    以下是Java api 中Java.util.zip包下面自带的压缩和解压缩的工具包实现的代码(如果文件名存在非英文编码会出现问题):

    1. import java.io.File;
    2. import java.io.FileOutputStream;
    3. import java.io.IOException;
    4. import java.io.InputStream;
    5. import java.io.OutputStream;
    6. import java.util.Enumeration;
    7. import java.util.zip.ZipEntry;
    8. import java.util.zip.ZipFile;
    9. import org.apache.commons.io.IOUtils;
    10. public class ZipTest {
    11. /**
    12. * Unzip it
    13. *
    14. * @param zipFile
    15. * input zip file
    16. * @param output
    17. * zip file output folder
    18. * @throws IOException
    19. */
    20. public static void unZipIt(String file, String outputFolder)
    21. throws IOException {
    22. ZipFile zipFile = new ZipFile(file);
    23. try {
    24. Enumeration<? extends ZipEntry> entries = zipFile.entries();
    25. while (entries.hasMoreElements()) {
    26. ZipEntry entry = entries.nextElement();
    27. File entryDestination = new File(outputFolder, entry.getName());
    28. if (entry.isDirectory()) {
    29. entryDestination.mkdirs();
    30. } else {
    31. entryDestination.getParentFile().mkdirs();
    32. InputStream in = zipFile.getInputStream(entry);
    33. OutputStream out = new FileOutputStream(entryDestination);
    34. IOUtils.copy(in, out);
    35. IOUtils.closeQuietly(in);
    36. out.close();
    37. }
    38. }
    39. } finally {
    40. zipFile.close();
    41. }
    42. }
    43. public static void main(String[] args) throws Exception {
    44. unZipIt("test.zip","D://test");
    45. }
    46. }