2013-05-30 2 views
0

У меня сейчас есть функция makeBackup(), которая застегивает весь каталог в zip-файл, однако файлы слишком большие, поэтому мы решили переключиться на LZMA. Мы нашли библиотеку, которая делает это (lzma-java), однако, похоже, она сжимает только один файл, в то время как используемая нами функция zip позволяет добавлять файлы и каталоги в zip-файл.Функция преобразования zip-каталога с помощью java.util.zip для использования LZMA

Как мы можем реализовать то же самое с LZMA, изменив нашу функцию? Я добавил нашу текущую функцию ниже:

private static void makeBackup() 
    { 
     String backupPathString = "/home/backups"; 
     /* zip remote file */ 
     try 
     { 
      //name of zip file to create 
      String zipFilename = "backup.zip"; 

      //create ZipOutputStream object 
      ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(zipFilename)); 

      //path to the currentFile to be zipped 
      File zipFolder = new File(backupPathString); 

      //get path prefix so that the zip file does not contain the whole path 
      // eg. if currentFile to be zipped is /home/lalit/test 
      // the zip file when opened will have test currentFile and not home/lalit/test currentFile 
      int len = zipFolder.getAbsolutePath().lastIndexOf(File.separator); 
      String baseName = zipFolder.getAbsolutePath().substring(0, len + 1) + File.separator + "todaybackups"; 

      zipFilesInPath(zipOutStream, backupPathString, baseName); 
      zipOutStream.flush(); 
      zipOutStream.close(); 
     } 
     catch (IOException e) 
     { 
     } 
    } 

    private static void zipFilesInPath(ZipOutputStream zipOutputStream, String filePath, String baseName) throws IOException 
    { 
     File currentFile = new File(filePath); 
     ArrayList<File> filesArrayList = new ArrayList<File>(Arrays.asList(currentFile.listFiles())); 
     if (filesArrayList.isEmpty()) 
     { 
      String name = currentFile.getAbsolutePath().substring(baseName.length()); 
      ZipEntry zipEntry = new ZipEntry(name + "/" + "."); 
      zipOutputStream.putNextEntry(zipEntry); 
     } 
     for (File file : filesArrayList) 
     { 
      if (file.isDirectory()) 
      { 
       zipFilesInPath(zipOutputStream, file.getAbsolutePath(), baseName); 
      } 
      else 
      { 
       String name = file.getAbsolutePath().substring(baseName.length()); 
       ZipEntry zipEntry = new ZipEntry(name); 
       zipOutputStream.putNextEntry(zipEntry); 
       IOUtils.copy(new FileInputStream(file), zipOutputStream); 
       zipOutputStream.closeEntry(); 
      } 
     } 
    } 

    private static void unzipFilesToPath(ZipInputStream zipInputStream, String fileExtractPath) throws IOException 
    { 
     ZipEntry entry; 
     while ((entry = zipInputStream.getNextEntry()) != null) 
     { 
      int count; 
      byte[] data = new byte[2048]; 

      /*let's make the directory structure needed*/ 
      File destFile = new File(fileExtractPath, entry.getName()); 
      File destinationParent = destFile.getParentFile(); 
      // create the parent directory structure if needed 
      destinationParent.mkdirs(); 

      if (!entry.isDirectory() && !entry.getName().substring(entry.getName().length() - 1).equals(".")) 
      { 
       final FileOutputStream fos = new FileOutputStream(fileExtractPath + File.separator + entry.getName()); 
       final BufferedOutputStream dest = new BufferedOutputStream(fos, 2048); 
       while ((count = zipInputStream.read(data, 0, 2048)) != -1) 
       { 
        dest.write(data, 0, count); 
       } 
       dest.flush(); 
       dest.close(); 
      } 
     } 
    } 
+0

если вы сжимаете сначала, используя zip, а затем lzma, вы получаете достаточную степень сжатия? – fGo

+0

no .. Если я поместил тот же файл, который скопировал 4 раза в каталог, если я застегнул его прямо с lzma, я получаю 1/4 размер первого зажима, а затем сжатие lzma – dendini

ответ

0

по-видимому, не представляется возможным, и то, что вам нужно сделать, это пакет все ваши файлы в тар/почтовый индекс, а затем применить LZMA. взгляните на это How to use LZMA SDK to compress/decompress in Java