2011-01-04 2 views
0

Я уверен, что есть зрелая, широко используемая утилита ZIP-архива, я просто не могу понять. Что-то с той же зрелостью, что и Apache Commons, Google Collections, Joda TimeЧто такое «Jodatime»/«Apache commons» от Zip/Unzip Java-утилиты?

Я пытаюсь выполнить простейшую задачу получения zip-файла в виде байтового массива (ZipInputStream) и извлечь его в папку. это кажется очень утомительной задачей.

Я хотел бы надеяться на синтаксический сахар API, который делает somethnig так:

public class MyDreamZIPUtils 
     public static void extractToFolder(ZipInputStream zin, File outputFolderRoot){ 
      ... 
     } 
     public static void extractToFolder(ZipFile zf, File outputFolderRoot){ 
      ... 
     } 

     public static zipFolder(File folderToZip, File zippedFileLocation){ 
      ... 
     } 

     public static zipFolder(File folderToZip, ByteArrayOutputStream zipResult){ 
      ... 
     } 

Что-нибудь подобное? Я что-то упустил?

+0

Да, я был разочарован, тоже, я ожидал большего от commons-compress ... Ну, это типичный стиль Java, не так ли? –

ответ

2

Я использовал только вызовы API Java ... Я не делал все свои методы. вы можете понять их отсюда ... Пожалуйста, обратите внимание, я не утверждаю, что код ошибка бесплатно ... использовать на свой страх и риск :)

public static void extractToFolder(ZipInputStream zin, File outputFolderRoot) 
       throws IOException { 

      FileOutputStream fos = null; 
      byte[] buf = new byte[1024]; 
      ZipEntry zipentry; 

      for (zipentry = zin.getNextEntry(); zipentry != null; zipentry = zin.getNextEntry()) { 

       try { 
        String entryName = zipentry.getName(); 
        System.out.println("Extracting: " + entryName); 
        int n; 

        File newFile = new File(outputFolderRoot, entryName); 
        if (zipentry.isDirectory()) { 
         newFile.mkdirs(); 
         continue; 
        } else { 
         newFile.getParentFile().mkdirs(); 
         newFile.createNewFile(); 
        } 

        fos = new FileOutputStream(newFile); 

        while ((n = zin.read(buf, 0, 1024)) > -1) 
         fos.write(buf, 0, n); 

        fos.close(); 
        zin.closeEntry(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } finally { 
        if (fos != null) 
         try { 
          fos.close(); 
         } catch (Exception ignore) { 
         } 
       } 

      } 

      zin.close(); 

     } 


    public static void zipFolder(File folderToZip, File zippedFileLocation) throws IOException { 
     // create a ZipOutputStream to zip the data to 
     ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zippedFileLocation)); 
     String path = ""; 
     zipDir(folderToZip, zos, path); 
     // close the stream 
     zos.close(); 
    } 

    private static void zipDir(File directory, ZipOutputStream zos, String path) throws IOException { 
     File zipDir = directory; 
     // get a listing of the directory content 
     String[] dirList = zipDir.list(); 
     byte[] readBuffer = new byte[2156]; 
     int bytesIn = 0; 
     // loop through dirList, and zip the files 
     for (int i = 0; i < dirList.length; i++) { 
      File f = new File(zipDir, dirList[i]); 
      if (f.isDirectory()) { 
       zipDir(new File(f.getPath()), zos, path + f.getName() + "/"); 
       continue; 
      } 
      FileInputStream fis = new FileInputStream(f); 
      try { 
       ZipEntry anEntry = new ZipEntry(path + f.getName()); 
       zos.putNextEntry(anEntry); 
       bytesIn = fis.read(readBuffer); 
       while (bytesIn != -1) { 
        zos.write(readBuffer, 0, bytesIn); 
        bytesIn = fis.read(readBuffer); 
       } 
      } finally { 
       fis.close(); 
      } 
     } 
    } 

Reference Java2s

+0

Я бы дал вам +3 за усилия, если бы мог ... определенно будет использовать его, если общий компресс Apache не собирается доставлять ... –