compression - फ़ाइलों को ज़िप/अनजिप करने के लिए एक अच्छी जावा लाइब्रेरी क्या है?




zip unzip (6)

मैंने डिफ़ॉल्ट ज़िप लाइब्रेरी को देखा जो जेडीके और अपाचे संपीड़न libs के साथ आता है और मैं 3 कारणों से उनसे नाखुश हूं:

  1. वे फूले हुए हैं और खराब एपीआई डिजाइन है। मुझे बॉयलर प्लेट बाइट सरणी आउटपुट, ज़िप इनपुट, स्ट्रीम आउट स्ट्रीम और करीबी प्रासंगिक धाराओं और अपवादों को पकड़ने और बाइट बफर को अपने आप पर ले जाना है ? मेरे पास एक सरल एपीआई क्यों नहीं है जो इस Zipper.unzip(InputStream zipFile, File targetDirectory, String password = null) और Zipper.zip(File targetDirectory, String password = null) Zipper.unzip(InputStream zipFile, File targetDirectory, String password = null) Zipper.zip(File targetDirectory, String password = null) जो बस काम करता है?

  2. ऐसा लगता है कि ज़िपिंग अनजिपिंग फ़ाइल मेटा-डेटा को नष्ट कर देता है और पासवर्ड हैंडलिंग टूटा हुआ है।

  3. साथ ही, यूनिक्स के साथ प्राप्त कमांड लाइन ज़िप उपकरण की तुलना में मैंने कोशिश की सभी पुस्तकालय 2-3x धीमी थीं?

मेरे लिए (2) और (3) मामूली अंक हैं लेकिन मैं वास्तव में एक लाइन इंटरफेस के साथ एक अच्छी तरह से परीक्षण पुस्तकालय चाहता हूँ।


zip4j साथ एक फ़ोल्डर / फ़ाइल को ज़िप / अनजिप करने के लिए पूर्ण कार्यान्वयन

here से जार डाउनलोड here , और इसे अपने प्रोजेक्ट बिल्ड पथ में जोड़ें। class bellow किसी भी फ़ाइल या फ़ोल्डर को संकुचित और निकालने, पासवर्ड सुरक्षा के साथ या बिना,

import java.io.File;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import net.lingala.zip4j.core.ZipFile;  

public class Compressor {
    public static void zip(String targetPath, String destinationFilePath, String password) {
        try {
            ZipParameters parameters = new ZipParameters();
            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);

            if(password.length()>0){
                parameters.setEncryptFiles(true);
                parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
                parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
                parameters.setPassword(password);
            }

            ZipFile zipFile = new ZipFile(destinationFilePath);

            File targetFile = new File(targetPath);
            if(targetFile.isFile()){
                zipFile.addFile(targetFile, parameters);
            }else if(targetFile.isDirectory()){
                zipFile.addFolder(targetFile, parameters);
            }

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

    public static void unzip(String targetZipFilePath, String destinationFolderPath, String password) {
        try {
            ZipFile zipFile = new ZipFile(targetZipFilePath);
            if (zipFile.isEncrypted()) {
                zipFile.setPassword(password);
            }
            zipFile.extractAll(destinationFolderPath);

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

    /**/ /// for test only
    public static void main(String[] args) {

        String targetPath = "target\\file\\or\\folder\\path";
        String zipFilePath = "zip\\file\\Path"; 
        String unzippedFolderPath = "destination\\folder\\path";
        String password = "your_password"; // keep it EMPTY<""> for applying no password protection

        Compressor.zip(targetPath, zipFilePath, password);
        Compressor.unzip(zipFilePath, unzippedFolderPath, password);
    }/**/
}

एक अन्य विकल्प जिसे आप चेक आउट कर सकते हैं वह है zt-zip मेवेन सेंट्रल और प्रोजेक्ट पेज से https://github.com/zeroturnaround/zt-zip

इसमें मानक पैकिंग और अनपॅकिंग कार्यक्षमता (स्ट्रीम और फाइल सिस्टम पर) + संग्रह में फ़ाइलों के लिए परीक्षण करने या प्रविष्टियों को जोड़ने / निकालने के लिए कई सहायक विधियां हैं।


केवल जेडीके का उपयोग करके ज़िप फ़ाइल और उसके सभी उपफोल्डर्स निकालें:

private void extractFolder(String zipFile,String extractFolder) 
{
    try
    {
        int BUFFER = 2048;
        File file = new File(zipFile);

        ZipFile zip = new ZipFile(file);
        String newPath = extractFolder;

        new File(newPath).mkdir();
        Enumeration zipFileEntries = zip.entries();

        // Process each entry
        while (zipFileEntries.hasMoreElements())
        {
            // grab a zip file entry
            ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
            String currentEntry = entry.getName();

            File destFile = new File(newPath, currentEntry);
            //destFile = new File(newPath, destFile.getName());
            File destinationParent = destFile.getParentFile();

            // create the parent directory structure if needed
            destinationParent.mkdirs();

            if (!entry.isDirectory())
            {
                BufferedInputStream is = new BufferedInputStream(zip
                .getInputStream(entry));
                int currentByte;
                // establish buffer for writing file
                byte data[] = new byte[BUFFER];

                // write the current file to disk
                FileOutputStream fos = new FileOutputStream(destFile);
                BufferedOutputStream dest = new BufferedOutputStream(fos,
                BUFFER);

                // read and write until last byte is encountered
                while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
                    dest.write(data, 0, currentByte);
                }
                dest.flush();
                dest.close();
                is.close();
            }


        }
    }
    catch (Exception e) 
    {
        Log("ERROR: "+e.getMessage());
    }

}

ज़िप फ़ाइलें और उसके सभी सबफ़ोल्डर:

 private void addFolderToZip(File folder, ZipOutputStream zip, String baseName) throws IOException {
    File[] files = folder.listFiles();
    for (File file : files) {
        if (file.isDirectory()) {
            addFolderToZip(file, zip, baseName);
        } else {
            String name = file.getAbsolutePath().substring(baseName.length());
            ZipEntry zipEntry = new ZipEntry(name);
            zip.putNextEntry(zipEntry);
            IOUtils.copy(new FileInputStream(file), zip);
            zip.closeEntry();
        }
    }
}

क्या आपने http://commons.apache.org/vfs/ पर एक नज़र http://commons.apache.org/vfs/ ? यह आपके लिए बहुत सी चीजों को सरल बनाने का दावा करता है। लेकिन मैंने इसे कभी भी एक परियोजना में इस्तेमाल नहीं किया है।

मुझे जेडीके या अपाचे संपीड़न के अलावा जावा-मूल संपीड़न libs के बारे में भी पता नहीं है।

मुझे याद है कि एक बार जब हम अपाचे चींटी से कुछ फीचर्स फिसल गए - उनमें संपीड़न / डिकंप्रेशन के लिए बहुत सारे यूटिल हैं।

वीएफएस के साथ नमूना कोड इस तरह दिखेगा:

File zipFile = ...;
File outputDir = ...;
FileSystemManager fsm = VFS.getManager();
URI zip = zipFile.toURI();
FileObject packFileObject = fsm.resolveFile(packLocation.toString());
FileObject to = fsm.toFileObject(destDir);
FileObject zipFS;
try {
    zipFS = fsm.createFileSystem(packFileObject);
    fsm.toFileObject(outputDir).copyFrom(zipFS, new AllFileSelector());
} finally {
    zipFS.close();
}

मुझे देर हो चुकी है और बहुत सारे जवाब हैं लेकिन यह zip4j के लिए सबसे अच्छी पुस्तकालयों में से एक है जिसका मैंने उपयोग किया है। इसका सरल (कोई बॉयलर कोड नहीं) और आसानी से पासवर्ड संरक्षित फाइलों को संभाल सकता है।

import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.core.ZipFile;


public static void unzip(){
    String source = "some/compressed/file.zip";
    String destination = "some/destination/folder";
    String password = "password";

    try {
         ZipFile zipFile = new ZipFile(source);
         if (zipFile.isEncrypted()) {
            zipFile.setPassword(password);
         }
         zipFile.extractAll(destination);
    } catch (ZipException e) {
        e.printStackTrace();
    }
}

मेवेन निर्भरता है:

<dependency>
    <groupId>net.lingala.zip4j</groupId>
    <artifactId>zip4j</artifactId>
    <version>1.3.2</version>
</dependency>

ट्रूजिप एक बहुत अच्छी परियोजना है।

ट्रूजिप वर्चुअल फाइल सिस्टम (वीएफएस) के लिए जावा आधारित प्लग-इन फ्रेमवर्क है जो संग्रह फ़ाइलों को पारदर्शी पहुंच प्रदान करता है जैसे कि वे केवल सादे निर्देशिका थे

उदाहरण के लिए ( website ):

File file = new TFile("archive.tar.gz/README.TXT");
OutputStream out = new TFileOutputStream(file);
try {
   // Write archive entry contents here.
   ...
} finally {
   out.close();
}