Что такое "Jodatime" / "Apache commons" утилит Zip / Unzip Java? - PullRequest
0 голосов
/ 04 января 2011

Я уверен, что есть зрелая, широко используемая утилита ZIP-файлов, но я просто не могу этого выяснить.Что-то с той же зрелостью, что и Apache Commons, Google Collections, Joda Time

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

Я хотел бы надеяться на синтаксический API-интерфейс сахара, который выполняет что-то вроде этого:

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){
           ...
      }

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

Ответы [ 2 ]

6 голосов
/ 04 января 2011

http://commons.apache.org/compress/

Я уверен, что вы можете написать "синтаксический сахар" поверх этого.

Javadoc: http://commons.apache.org/compress/apidocs/index.html

2 голосов
/ 05 января 2011

Я использовал только вызовы 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();
            }
        }
    }

Ссылка Java2s

...