lxw82307 发表于 2013-2-5 09:16:07

JAVA使用7-zip解压缩带密码的Zip文件(非Proccess方法)

首先到sourceforge网站下载sevenzipjbinding压缩包
我下载的版本是sevenzipjbinding-4.65-1.04-rc-extr-only-AllWindows.zip
下载地址如下:
https://sourceforge.net/projects/sevenzipjbind/files/7-Zip-JBinding/4.65-1.04rc-extr-only/sevenzipjbinding-4.65-1.04-rc-extr-only-AllWindows.zip/download
编写代码如下:
public void unzipDirWithPassword( final String sourceZipFile ,            final String destinationDir , final String password ){         RandomAccessFile randomAccessFile = null;         ISevenZipInArchive inArchive = null;         try{            randomAccessFile = new RandomAccessFile(sourceZipFile, "r");            inArchive = SevenZip.openInArchive(null, // autodetect archive type            new RandomAccessFileInStream(randomAccessFile));                           // Getting simple interface of the archive inArchive            ISimpleInArchive simpleInArchive = inArchive.getSimpleInterface();                           for (final ISimpleInArchiveItem item : simpleInArchive.getArchiveItems()){                  final int[] hash = new int[] { 0 };                  if (!item.isFolder()){                      ExtractOperationResult result;                      result = item.extractSlow(new ISequentialOutStream(){                            public int write(final byte[] data) throws SevenZipException{                                  try{                                        if(item.getPath().indexOf(File.separator)>0){                                          String path = destinationDir+File.separator+item.getPath(). substring(0,item.getPath().lastIndexOf(File.separator));                                          File folderExisting = new File(path);                                          if (!folderExisting.exists())                                                 new File(path).mkdirs();                                        }                                        if(!new File(destinationDir + File.separator+item.getPath()).exists()){                                          new File(destinationDir).createNewFile();                                        }                                        OutputStream out = new FileOutputStream(destinationDir+ File.separator+item.getPath());                                        out.write(data);                                        out.close();                                 }catch( Exception e ){                                        e.printStackTrace();                                 }                                 hash |= Arrays.hashCode(data);                                 return data.length; // Return amount of proceed data                           }                     },password); /// password.                     if (result == ExtractOperationResult.OK){                           System.out.println(String.format("%9X | %s",                                       hash, item.getPath()));                     }else{                           System.err.println("Error extracting item: " + result);                     }                  }            }         } catch (Exception e){                e.printStackTrace();         } finally {                if (inArchive != null){                  try {                     inArchive.close();                  } catch (SevenZipException e){                     System.err.println("Error closing archive: " + e);                     e.printStackTrace();                  }                }                if (randomAccessFile != null) {                     try{                         randomAccessFile.close();                     } catch (IOException e){                         System.err.println("Error closing file: " + e);                         e.printStackTrace();                     }                }         }    } 特别提示:压缩文件的文件如果大小为0,则解压缩不出来文件
页: [1]
查看完整版本: JAVA使用7-zip解压缩带密码的Zip文件(非Proccess方法)