无压缩的打包文件

在构建补丁管理系统中,由于补丁文件已压缩,因此打包时不需再次压缩以提高速度。文章介绍了如何使用Java调用Apache的公共组件包,控制tar包的打包过程,以实现无压缩打包。
摘要由CSDN通过智能技术生成

 在做一个补丁管理系统,要实现一个对文件打包的过程,因为补丁已经是压缩过的,所以打包时不需要再压缩,另一方面没有压缩打包过程也会快很多,发现zip进行打包已经是默认压缩的。但是tar包是可控的,可以设置压缩选项,此处是用java实现,

引入apache的公共组件包

 

 
 
  1. import org.apache.commons.compress.archivers.ArchiveEntry; 
  2. import org.apache.commons.compress.archivers.ArchiveOutputStream; 
  3. import org.apache.commons.compress.archivers.ArchiveStreamFactory; 
  4. import org.apache.commons.compress.archivers.tar.TarArchiveEntry; 
  5. import org.apache.commons.compress.utils.IOUtils; 

下面是实现,带了很多项目内部字段,请大家见谅 

 

 
 
  1. /** 
  2.      * 文件打包 
  3.      *  
  4.      * @return 
  5.      * @throws Exception 
  6.      */ 
  7.  
  8.  
  9.     public boolean filesToTar(TaskInfo taskInfo) throws Exception 
  10.     { 
  11.         /* 文件打包 */ 
  12.         String curreenTimeFlag =  getCurrentTimeFlag(); 
  13.         tarFullName = tarName + curreenTimeFlag; 
  14.  
  15.         tarPath = "k:/packetFolder/" + tarFullName + ".tar"
  16.  
  17.         try { 
  18.             File output = new File(tarPath); 
  19.             OutputStream out = new FileOutputStream(output); 
  20.             ArchiveOutputStream os = new ArchiveStreamFactory() 
  21.                     .createArchiveOutputStream("tar", out); 
  22.             TarArchiveEntry entry = new TarArchiveEntry(""); 
  23.             if(addFileToArchiveEntry(os, getPatchInfoMap(taskInfo), taskInfo) == 2
  24.             { 
  25.                 return false
  26.             } 
  27.              
  28.             entry.setUserId(0); 
  29.             entry.setGroupId(0); 
  30.             entry.setUserName("avalon"); 
  31.             entry.setGroupName("excalibur"); 
  32.             entry.setMode(0100000);    //设置打包模式 
  33.             os.putArchiveEntry(entry); 
  34.             os.closeArchiveEntry(); 
  35.             os.close(); 
  36.         } catch (IOException e) { 
  37.             // TODO Auto-generated catch block 
  38.             File file = new File(tarPath); 
  39.             file.delete(); 
  40.             e.printStackTrace(); 
  41.             return false
  42.         } 
  43.         taskInfo.savePath = tarPath; 
  44.         return true
  45.     } 
  46.  
  47.    
       
    1. /** 
    2.      * 多个文件打包的实现(子函数) 
    3.      *  
    4.      * @return 2:取消打包  1:打包完成 
    5.      * @param os 
    6.      * @param patchFileMap 
    7.      * @param isCanceled     是否取消打包 
    8.      * @throws FileNotFoundException 
    9.      * @throws IOException 
    10.      */ 
    11.     @SuppressWarnings("rawtypes"
    12.     public int addFileToArchiveEntry(ArchiveOutputStream os, 
    13.             Map<String, TarFileOtherInfo> patchFileMap, TaskInfo taskInfo) throws FileNotFoundException, 
    14.             IOException { 
    15.         int tarSizeProcessing = 0
    16.         Set keys = patchFileMap.keySet(); 
    17.         Iterator iterator = keys.iterator(); 
    18.         while (iterator.hasNext()) { 
    19.             if(taskInfo.isCanceled) 
    20.             { 
    21.                 return 2
    22.             } 
    23.             String patchFileId = (String) iterator.next(); 
    24.             TarFileOtherInfo   tarFileOtherInfo;  
    25.             tarFileOtherInfo = patchFileMap.get(patchFileId); 
    26.             String patchFilePath = tarFileOtherInfo.fullPath; 
    27.             String patchFileFullPath = getRootFilepath() + patchFilePath; 
    28.             File file = getFile(patchFileFullPath); 
    29.             if(file == null
    30.                 return 2
    31.             String patchAlias; 
    32.             patchAlias = splitPatchPath(patchFilePath) + patchFileId + ".exe"
    33.             if(!addArchiveEntry(os, patchAlias, file)) 
    34.                 return 2
    35.             tarSizeProcessing = tarSizeProcessing + tarFileOtherInfo.fileSize; 
    36.             taskInfo.currentSize = tarSizeProcessing; 
    37.         } 
    38.         File filesql = getFile(sqlLitePath); 
    39.         String sqlLite = splitString(sqlLitePath); 
    40.         if(!addArchiveEntry(os, sqlLite, filesql)) 
    41.             return 2
    42.         return 1
    43.     } 
    44.  
    45.     /** 
    46.      * 单个文件打包的实现 
    47.      *  
    48.      * @param os 
    49.      * @param filename 
    50.      * @param infile 
    51.      * @throws IOException 
    52.      * @throws FileNotFoundException 
    53.      */ 
    54.     public boolean addArchiveEntry(ArchiveOutputStream os, String filename, 
    55.             final File infile) { 
    56.         ArchiveEntry entry; 
    57.         try { 
    58.             entry = os.createArchiveEntry(infile, filename); 
    59.             os.putArchiveEntry(entry); 
    60.             IOUtils.copy(new FileInputStream(infile), os); 
    61.             os.closeArchiveEntry(); 
    62.             return true
    63.         } catch (IOException e) { 
    64.             // TODO Auto-generated catch block 
    65.             e.printStackTrace(); 
    66.             return false
    67.         } 
    68.          
    69.     } 

 

本文出自 “永远的朋友” 博客,请务必保留此出处http://yaocoder.blog.51cto.com/2668309/602120

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值