Soru Java'da zip arşivi oluşturma


7zip programı tarafından oluşturulmuş bir dosyam var. kullandım söndürmek sıkıştırmak için yöntem. Şimdi aynı arşivi (aynı MD5sum ile) oluşturmak istiyorum java. Zip dosyası oluşturduğumda, örneğin internette bulduğum algoritmayı kullandım. http://www.kodejava.org/examples/119.html ancak bu yöntemle zip dosyası oluşturduğumda, sıkıştırılmış boyut, sıkıştırılmamış dosyanın boyutundan daha büyüktür, bu yüzden neler oluyor? Bu çok kullanışlı bir sıkıştırma değil. Peki 7zip programı ile oluşturduğum zip dosyasıyla tam olarak aynı olan zip dosyasını nasıl oluşturabilirim? 7zip programında oluşturduğum zip dosyası hakkında tüm bilgilere sahip olmanıza yardımcı olur.


31
2018-01-23 12:28


Menşei




Cevaplar:


// simplified code for zip creation in java

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

public class ZipCreateExample {

    public static void main(String[] args) throws Exception {

        // input file 
        FileInputStream in = new FileInputStream("F:/sometxt.txt");

        // out put file 
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream("F:/tmp.zip"));

        // name the file inside the zip  file 
        out.putNextEntry(new ZipEntry("zippedjava.txt")); 

        // buffer size
        byte[] b = new byte[1024];
        int count;

        while ((count = in.read(b)) > 0) {
            out.write(b, 0, count);
        }
        out.close();
        in.close();
    }
}

58
2017-12-01 07:45



ZIP klasörünü açamıyorum, Sıkıştırılmış Klasöre Erişim reddedildiğini söylüyor - T Kanagaraj


Sadece açıklığa kavuşturmak için, orijinaliniz için 7zip'te ZIP algoritmasını kullandınız mı? Ayrıca 7zip, diğer satıcılara göre% 2-10 daha iyi bir sıkıştırma oranına sahip olduğunu iddia ediyor. Java'ya yerleştirilen ZIP algoritmasının 7zip'teki gibi neredeyse optimize edilmediğini tahmin ediyorum. Benzer şekilde sıkıştırılmış bir dosya istiyorsanız, en iyi seçiminiz 7zip'i komut satırından çağırmaktır.

Bir ZIP dosyasını açmaya, içindeki bir dosyayı değiştirmeye ve daha sonra aynı MD5 hash değerine sahip olacak şekilde yeniden sıkıştırmaya mı çalışıyorsunuz? Hashes bunu yapmanı engellemek içindir.


5
2018-01-23 12:55



Ayrıca, 7zip ile sıkıştırırken çok sayıda seçenek var. 7zip'i doğrudan çağırırken bile, kullanılan yapılandırmayı tahmin etmeniz gerekir. - Cephalopod
Çok fazla yapılandırma deniyorum ama yine de sıkıştırılmış boyut, sıkıştırılmamış boyutla aynı veya daha düşük ama asla yüksek değil - hudi
hm ve 7zip'i komut satırından nasıl kullanabilirim? Bana bir örnek verebilirmisin - hudi
dotnetperls.com/7-zip-examples - Maxym


ZipOutputStream sıkıştırmayı ayarlamak için birkaç yönteme sahiptir:

public void setMethod (int yöntemi)

Varsayılan sıkıştırma yöntemini ayarlar   sonraki girişler için. Bu varsayılan   sıkıştırma ne zaman kullanılır   yöntem bir için belirtilmemiş   bireysel ZIP dosyası girişi ve   başlangıçta DEFLATED olarak ayarlanmış.

public void setLevel (int seviye)

İçin sıkıştırma seviyesini ayarlar   DEFLATED olan sonraki girişler.   Varsayılan ayar DEFAULT_COMPRESSION şeklindedir. seviye - sıkıştırma seviyesi (0-9)

Bir şeyden sonra eklediğinizde:

ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(target));
zos.setMethod( ZipOutputStream.DEFLATED );
zos.setLevel( 5 );
...

sıkıştırmayı geliştirmez mi?


5
2018-01-23 13:00



Daha önce söylediğim gibi sönmüş bir yöntem kullandım ve aynı zamanda tüm sıkıştırma seviyesini (-1 .. 9) deniyorum ama yine de hiçbir şey değişmedi. - hudi


Burada, mutlak yolu, dizin ile aynı ada sahip bir zip dosyası oluşturacağınız bir işlevdir (alt klasörün ve dosyaların her birinden fermuarını istediğiniz gibi). varsa.

public class FileUtil { 
final static int BUFFER = 2048;
private static Logger log = Logger.getLogger(FileUtil.class);

      public static boolean createZipArchive(String srcFolder) {

    try {
        BufferedInputStream origin = null;



        FileOutputStream    dest = new FileOutputStream(new File(srcFolder+ ".zip"));

        ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
        byte data[] = new byte[BUFFER];

        File subDir = new File(srcFolder);
        String subdirList[] = subDir.list();
        for(String sd:subdirList)
        {
                // get a list of files from current directory
                File f = new File(srcFolder+"/"+sd);
                if(f.isDirectory())
                {
                    String files[] = f.list();

                    for (int i = 0; i < files.length; i++) {
                        System.out.println("Adding: " + files[i]);
                        FileInputStream fi = new FileInputStream(srcFolder  + "/"+sd+"/" + files[i]);
                        origin = new BufferedInputStream(fi, BUFFER);
                        ZipEntry entry = new ZipEntry(sd +"/"+files[i]);
                        out.putNextEntry(entry);
                        int count;
                        while ((count = origin.read(data, 0, BUFFER)) != -1) {
                            out.write(data, 0, count);
                            out.flush();
                        }

                    }
                }
                else //it is just a file
                {
                    FileInputStream fi = new FileInputStream(f);
                    origin = new BufferedInputStream(fi, BUFFER);
                    ZipEntry entry = new ZipEntry(sd);
                    out.putNextEntry(entry);
                    int count;
                    while ((count = origin.read(data, 0, BUFFER)) != -1) {
                        out.write(data, 0, count);
                        out.flush();
                    }

                }
        }
        origin.close();
        out.flush();
        out.close();
    } catch (Exception e) {
        log.info("createZipArchive threw exception: " + e.getMessage());        
        return false;

    }


    return true;
}   
  }

4
2018-05-06 13:56





Aynı kaynak dosyadan iki aynı zip dosyası (aynı md5sum dahil) oluşturmak için, aynı zip programını kullanmanızı tavsiye ederim - her zaman aynı Java programını kullanın ya da her zaman 7zip kullanın.

Örneğin 7zip yardımcı programı çok seçeneklerinin çoğu - sadece özelleştirilebilen varsayılanlar (veya sürümler arasında farklılık gösterir) - ve herhangi bir Java zip uygulamasının da bu seçenekleri açık bir şekilde ayarlamaları gerekir. Java uygulamanız harici bir "7z" programını çağırıyorsa, yine de özel bir Java zip uygulamasının daha iyi performans göstermesini sağlayabilirsiniz. (Bu, uygulamayı kolayca ölçekleyebileceğiniz harita azaltma sorununa da iyi bir örnektir.)

Ancak, sunucu tarafında oluşturulan bir zip dosyası ve istemci tarafı tarafından oluşturulan bir zip dosyası varsa, karşılaşacağınız ana sorun, zip dosyasının yalnızca orijinal dosyaya ek olarak iki şeyi de saklamasıdır: (1) dosya adı, ve (2) dosya zaman damgası. Bunlardan herhangi biri değiştiyse, sonuçta oluşan zip dosyası farklı bir md5sum olacaktır:

$ ls tst1/
foo.tar

$ cp -r tst1 tst2

$ ( cd tst1; zip foo.zip foo.tar )  ; ( cd tst2; zip foo.zip foo.tar )   ; md5sum tst?/foo.zip
updating: foo.tar (deflated 20%)
updating: foo.tar (deflated 20%)
359b82678a2e17c1ddbc795ceeae7b60  tst1/foo.zip
b55c33c0414ff987597d3ef9ad8d1d08  tst2/foo.zip

Ancak, "cp -p" kullanarak (zaman damgasını koru):

$ cp -p -r tst1 tst2

$ ( cd tst1; zip foo.zip foo.tar )  ; ( cd tst2; zip foo.zip foo.tar )   ; md5sum tst?/foo.zip
updating: foo.tar (deflated 20%)
updating: foo.tar (deflated 20%)
359b82678a2e17c1ddbc795ceeae7b60  tst1/foo.zip
359b82678a2e17c1ddbc795ceeae7b60  tst2/foo.zip

Aynı sorunu fermuarın içindeki dosyalar aynı olsa bile, farklı dosya adları ve yollarla birlikte bulacaksınız.


1
2017-12-14 11:54





package comm;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;*emphasized text*
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Zip1 {
      public static void main( String[] args )
        {
            byte[] buffer = new byte[1024];

            try{

                File f= new  File("E:\\");
                f.mkdirs();
                File origFile= new File(f,"MyZipFile2.zip");
                FileOutputStream fos = new FileOutputStream(origFile);

                ZipOutputStream zos = new ZipOutputStream(fos);
                ZipEntry ze= new ZipEntry("test.pdf");
                zos.putNextEntry(ze);
                FileInputStream in = new FileInputStream("D:\\Test.pdf");

                int len;
                while ((len = in.read(buffer)) > 0) {
                    zos.write(buffer, 0, len);
                }

                in.close();
                zos.closeEntry();

                //remember close it
                zos.close();

                System.out.println("Done");

            }catch(IOException ex){
               ex.printStackTrace();
            }
        }
}

0
2017-07-31 12:14





Aşağıdaki kodları işlevselliklere sahip olarak bulabilirsiniz. zip ve halletmek. Umarım birine yardımcı olabilir.

package com.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;


/**
 * @author dinesh.lomte
 *
 */
public class ZipUtil {

    /**
     * 
     * @param source
     * @param destination
     */
    public static void unZip(String source, String destination) {

        String method = "unZip(String source, String destination)";
        ZipInputStream zipInputStream = null;
        try {
            // Creating the ZipInputStream instance from the source file
            zipInputStream = new ZipInputStream(new FileInputStream(source));
            // Getting the zipped file list entry
            ZipEntry zipEntry = zipInputStream.getNextEntry();
            // Iterating through the file list entry
            while (zipEntry != null) {
                String fileName = zipEntry.getName();
                File file = new File(new StringBuilder(destination)
                    .append(File.separator)
                    .append(AppUtil.getFileNameWithoutExtension(
                            AppUtil.getNameFromPath(source)))
                    .append(File.separator).append(fileName).toString());                
                // Creating non existing folders to avoid any FileNotFoundException 
                // for compressed folder
                new File(file.getParent()).mkdirs();
                FileOutputStream fileOutputStream = new FileOutputStream(file);
                byte[] buffer = new byte[1024];
                int length;
                while ((length = zipInputStream.read(buffer)) > 0) {
                    fileOutputStream.write(buffer, 0, length);
                }
                fileOutputStream.close();
                zipEntry = zipInputStream.getNextEntry();
            }
        } catch (IOException iOException) {
            System.out.println("Failed to unzip the ''{0}'' file located in ''{1}'' folder. Due to, {2}");

        } finally {
            // Validating if zipInputStream instance in not null
            if (zipInputStream != null) {
                try {
                    zipInputStream.closeEntry();
                    zipInputStream.close();
                } catch (IOException iOException) {                 
                }
            }
        }
    }

    /**
     * Traverse a directory from the source folder location and get all files,
     * and add the file into files list.
     *
     * @param node
     */
    public static void generateFileList(
            String source, File node, List<String> files) {     
        // Validating if the node is a file
        if (node.isFile()) {
            files.add(generateZipEntry(
                    source, node.getPath().toString()));
        }
        // Validating if the node is a directory
        if (node.isDirectory()) {
            String[] subNote = node.list();
            for (String filename : subNote) {
                generateFileList(source, new File(node, filename), files);
            }
        }
    }

    /**
     * Format the file path to zip
     * @param source
     * @param file
     * @return
     */
    private static String generateZipEntry(String source, String file) {
        return file.substring(source.length(), file.length());
    }

    /**
     * 
     * @param source
     * @param destination
     */
    public static void zip(String source, String destination) {

        String method = "zip(String source, String destination)";
        ZipOutputStream zipOutputStream = null;        
        try {            
            // Creating the zipOutputStream instance
            zipOutputStream = new ZipOutputStream(
                    new FileOutputStream(destination));
            List<String> files = new ArrayList<>();
            generateFileList(source, new File(source), files);
            // Iterating the list of file(s) to zip/compress
            for (String file : files) {
                // Adding the file(s) to the zip
                ZipEntry zipEntry = new ZipEntry(file);
                zipOutputStream.putNextEntry(zipEntry);
                FileInputStream fileInputStream = new FileInputStream(
                        new StringBuilder(source).append(File.separator)
                        .append(file).toString());
                int length;
                byte[] buffer = new byte[1024];
                while ((length = fileInputStream.read(buffer)) > 0) {
                    zipOutputStream.write(buffer, 0, length);
                }                
                // Closing the fileInputStream instance
                fileInputStream.close();
                // De-allocating the memory by assigning the null value
                fileInputStream = null;
            }
        } catch (IOException iOException) {
            System.out.println("Failed to zip the file(s) located in ''{0}'' folder. Due to, {1}");
        } finally {
            // Validating if zipOutputStream instance in not null
            if (zipOutputStream != null) {
                try {
                    zipOutputStream.closeEntry();
                    zipOutputStream.close();
                } catch (IOException iOException) {
                }
            }
        }
    }
}

0
2018-03-30 13:43