Утилита распаковать весь архив в каталог в java

Я хотел бы сделать что-то подобное в моей программе:

File zipFile = .....;
File destDir = ....;    
ImaginaryZipUtility.unzipAllTo(zipFile, destdir);

Я не могу первыми сделать это из программы. Где найти полезный метод, например, выше? Я попытался посмотреть на apache commons-io, но ничего там. Итак, где я должен выглядеть?

Ответ 1

Кажется, что можно сделать то, что я хочу, используя библиотеку TrueZip: https://truezip.dev.java.net/manual-6.html#Copying

Это не идеальная ситуация, так как библиотека довольно большая и с большим объемом, чем мне нужно (а также с некоторыми своеобразными и запутанными деталями, такими как организация вокруг подклассов java.io.File, которые также называются файлом для использования в классах, которые обычно также обрабатывают экземпляры java.io.File!).

По крайней мере, мне не обязательно находиться в ситуации, когда большинство строк кода в классе не связаны с ответственностью класса или поддерживают сложный класс утилиты в проекте, который не имеет отношения к цели модуля.

Я думаю, что это типичный пример по основной причине, по которой опытные разработчики переходят с Java на Ruby. Несмотря на обилие библиотек в java, слишком многие из них плохо разработаны, поэтому простые операции становятся столь же трудными, как и более специализированные. Похоже, что они написаны снизу вверх технологическими специалистами, которые больше стремятся разоблачить все детали и возможности, а не просто делать повседневные задачи. Люди apache заслуживают похвалы за создание библиотек, которые освобождают ваш класс от строк кода, особенно циклов и условных выражений, которые не связаны с бизнес-целями класса.

Ответ 2

очень старый код, который я смог выкопать

package com.den.frontend;

import java.util.; import java.util.zip; import java.io. *;

public class ZIPUtility 
{
    public static final int BUFFER_SIZE = 2048;

    //This function converts the zip file into uncompressed files which are placed in the 
    //destination directory
    //destination directory should be created first
    public static boolean unzipFiles(String srcDirectory, String srcFile, String destDirectory)
    {
        try
        {
            //first make sure that all the arguments are valid and not null
            if(srcDirectory == null)
            {
                System.out.println(1);
                return false;
            }
            if(srcFile == null)
            {
                System.out.println(2);
                return false;
            }
            if(destDirectory == null)
            {
                System.out.println(3);
                return false;
            }
            if(srcDirectory.equals(""))
            {
                System.out.println(4);
                return false;
            }
            if(srcFile.equals(""))
            {   
                System.out.println(5);
                return false;
            }
            if(destDirectory.equals(""))
            {
                System.out.println(6);
                return false;
            }
            //now make sure that these directories exist
            File sourceDirectory = new File(srcDirectory);
            File sourceFile = new File(srcDirectory + File.separator + srcFile);
            File destinationDirectory = new File(destDirectory);

            if(!sourceDirectory.exists())
            {
                System.out.println(7);
                return false;
            }
            if(!sourceFile.exists())
            {
                System.out.println(sourceFile);
                return false;
            }
            if(!destinationDirectory.exists())
            {
                System.out.println(9);
                return false;
            }

            //now start with unzip process
            BufferedOutputStream dest = null;

            FileInputStream fis = new FileInputStream(sourceFile);
            ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));

            ZipEntry entry = null;

            while((entry = zis.getNextEntry()) != null)
            {
                String outputFilename = destDirectory + File.separator + entry.getName();

                System.out.println("Extracting file: " + entry.getName());

                createDirIfNeeded(destDirectory, entry);

                int count;

                byte data[] = new byte[BUFFER_SIZE];

                //write the file to the disk
                FileOutputStream fos = new FileOutputStream(outputFilename);
                dest = new BufferedOutputStream(fos, BUFFER_SIZE);

                while((count = zis.read(data, 0, BUFFER_SIZE)) != -1)
                {
                    dest.write(data, 0, count);
                }

                //close the output streams
                dest.flush();
                dest.close();
            }

            //we are done with all the files
            //close the zip file
            zis.close();

        }
        catch(Exception e)
        {
            e.printStackTrace();
            return false;
        }

        return true;
    }

    private static void createDirIfNeeded(String destDirectory, ZipEntry entry)
    {
        String name = entry.getName();

        if(name.contains("/"))
        {
            System.out.println("directory will need to be created");

            int index = name.lastIndexOf("/");
            String dirSequence = name.substring(0, index);

            File newDirs = new File(destDirectory + File.separator + dirSequence);

            //create the directory
            newDirs.mkdirs();
        }
    }

}

Ответ 3

Я знаю, что я очень опаздываю на шоу, но я искал то же самое и нашел это через google. Самый простой способ найти задачу ant "распаковать". Вы можете использовать его без какой-либо сложной установки ant (для создания полного проекта ant есть материал, такой как ProjectHelper) из вашего источника java, включая

<dependency>
    <groupId>org.apache.ant</groupId>
    <artifactId>ant-compress</artifactId>
    <version>1.2</version>
</dependency>

Код для распаковки файла в каталог выглядит следующим образом:

org.apache.ant.compress.taskdefs.Unzip u = new Unzip();
u.setSrc(new File("<archive.zip>"));
u.setDest(new File("<targetDir>"));
u.execute();

Ответ 4

Ну, java.util.zip имеет классы, чтобы делать то, что вы хотите очень осторожно.