Как создать zip-файл из нескольких файлов изображений

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

Вот мой код. Кто-нибудь может сообщить мне, что здесь происходит?

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();

person Vighanesh Gursale    schedule 14.05.2013    source источник


Ответы (2)


Измените это:

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

к этому:

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

И установите размер буфера на 1024 байта:

b=new byte[1024];
person hoaz    schedule 14.05.2013
comment
спасибо, это работает очень хорошо, ты решил проблему, спасибо, братан, большое спасибо ....: D - person Vighanesh Gursale; 14.05.2013
comment
если вы считаете этот ответ подходящим, примите его. то же самое относится ко всем вашим вопросам, которые вы задавали в прошлом - person hoaz; 14.05.2013

Это моя функция zip, которую я всегда использую для любых файловых структур:

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;
}
person salocinx    schedule 14.05.2013
comment
Спасибо за этот образец, который работает хорошо, за исключением того, что мне пришлось изменить эту строку: FileInputStream in = new FileInputStream(files.get(i).getCanonicalName()); - person A. Masson; 19.05.2014
comment
Привет - вы правы, чтобы сохранить структуру папок, лучше использовать *.getCanonicalName(). Я адаптировал это к своему ответу - спасибо. - person salocinx; 19.05.2014
comment
Привет. Мне интересно (i), почему мы не очищаем буфер после оператора out.write, не будет ли буфер переполнен? (ii) каков должен быть размер буфера в целом для файлов размером менее 1 МБ? - person balboa_21; 30.12.2016