How to create a zip file of multiple image files

25,515

Solution 1

Change this:

while((length=fin.read())>0)

to this:

while((length=fin.read(b, 0, 1024))>0)

And set buffer size to 1024 bytes:

b=new byte[1024];

Solution 2

This is my zip function I always use for any file structures:

public static File zip(List<File> files, String filename) {
    File zipfile = new File(filename);
    // Create a buffer for reading the files
    byte[] buf = new byte[1024];
    try {
        // create the ZIP file
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));
        // compress the files
        for(int i=0; i<files.size(); i++) {
            FileInputStream in = new FileInputStream(files.get(i).getCanonicalName());
            // add ZIP entry to output stream
            out.putNextEntry(new ZipEntry(files.get(i).getName()));
            // transfer bytes from the file to the ZIP file
            int len;
            while((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            // complete the entry
            out.closeEntry();
            in.close();
        }
        // complete the ZIP file
        out.close();
        return zipfile;
    } catch (IOException ex) {
        System.err.println(ex.getMessage());
    }
    return null;
}
Share:
25,515
Vighanesh Gursale
Author by

Vighanesh Gursale

Updated on May 20, 2020

Comments

  • Vighanesh Gursale
    Vighanesh Gursale almost 4 years

    I am trying to create a zip file of multiple image files. I have succeeded in creating the zip file of all the images but somehow all the images have been hanged to 950 bytes. I don't know whats going wrong here and now I can't open the images were compressed into that zip file.

    Here is my code. Can anyone let me know what's going here?

    String path="c:\\windows\\twain32";
    File f=new File(path);
    f.mkdir();
    File x=new File("e:\\test");
    x.mkdir();
    byte []b;
    String zipFile="e:\\test\\test.zip";
    FileOutputStream fout=new FileOutputStream(zipFile);
    ZipOutputStream zout=new ZipOutputStream(new BufferedOutputStream(fout));
    
    
    File []s=f.listFiles();
    for(int i=0;i<s.length;i++)
    {
        b=new byte[(int)s[i].length()];
        FileInputStream fin=new FileInputStream(s[i]);
        zout.putNextEntry(new ZipEntry(s[i].getName()));
        int length;
        while((length=fin.read())>0)
        {
            zout.write(b,0,length);
        }
        zout.closeEntry();
        fin.close();
    }
    zout.close();
    
  • Vighanesh Gursale
    Vighanesh Gursale almost 11 years
    thanks it works very well You have solved the problem thanks bro thanks a lot....:D
  • hoaz
    hoaz almost 11 years
    if you think this answer is appropriate, accept it. the same applies to all your questions you asked in the past
  • A. Masson
    A. Masson almost 10 years
    Thankd for this sample which works well, except that I had to change this line: FileInputStream in = new FileInputStream(files.get(i).getCanonicalName());
  • salocinx
    salocinx almost 10 years
    Hi - you're right, in order to keep the folder structure, it's better to use *.getCanonicalName() I have adapted that to my answer - thank you.
  • balboa_21
    balboa_21 over 7 years
    Hi. I am wondering (i) why we are not clearing the buffer after out.write statement, wouldn't buffer get overflowed ? (ii) what should be the buffer size kept in general for size of files less than 1 MB ?