注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

love3400wind的blog

like

 
 
 

日志

 
 
 
 

java 解压缩带密码的压缩文件  

2012-07-29 16:16:02|  分类: IT |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

参考:

http://lxw82307.iteye.com/blog/1009306

首先到sourceforge网站下载sevenzipjbinding压缩包
下载的版本是sevenzipjbinding-4.65-1.04-rc-extr-only-AllWindows.zip

地址:http://sourceforge.net/projects/sevenzipjbind

 用上面的示例测试,发现了一个小小的问题:如果压缩包内的文件大于32k(即32768),则解压后的文件只写了最后一部分,并不是一个完整的文件。
经测试,修改后的代码如下:

private void deleteFile(String filePath) {
  File file = new File(filePath);
  if (file.exists()) { // 判断文件是否存在
   if (file.isFile()) { // 判断是否是文件
    file.delete(); // delete()方法 你应该知道 是删除的意思;
   } else if (file.isDirectory()) { // 否则如果它是一个目录
    File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
    for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件
     deleteFile(files[i].getPath()); // 把每个文件 用这个方法进行迭代
    }
   }
   //file.delete();
  } else {
   System.out.println("所删除的文件不存在!" + '\n');
  }
 }

 public List<String> unzipDirWithPassword( final String sourceZipFile , 
              final String destinationDir , final String password ){ 
  
  deleteFile(destinationDir);// delete prerevious file
  
  RandomAccessFile randomAccessFile = null; 
  ISevenZipInArchive inArchive = null; 
  List<String> fileName = new ArrayList<String>();
  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){  //folder
         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(); 
        } 
                
        File outFile = new File(destinationDir + File.separator+item.getPath());
                
        if(!outFile.exists()){ //if not exists
                    
         ByteBuffer bb = ByteBuffer.wrap(data);
         FileChannel out = new FileOutputStream(destinationDir+ File.separator+item.getPath()).getChannel();
         out.write(bb);
         out.close();
                    
        }  else {//exists
                  
         // 打开一个随机访问文件流,按读写方式
         RandomAccessFile randomFile = new RandomAccessFile(destinationDir+ File.separator+item.getPath(), "rw");
         // 文件长度,字节数
         long fileLength = randomFile.length();
         //将写文件指针移到文件尾。
         randomFile.seek(fileLength);
         randomFile.write(data);
         randomFile.close();
                  
        }
                
       }catch( Exception e ){ 
        e.printStackTrace(); 
       } 
       hash[0] |= 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[0], item.getPath())); 
      fileName.add(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(); 
             } 
   }
         return fileName;
  } 
 } 



添加了一个 deleteFile 方法,重点修改了 实现 ISequentialOutStream接口的写文件方法。如有错误,请指正,谢谢
  评论这张
 
阅读(1057)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017