2013-05-14 27 views
8

Tôi đang cố gắng tạo tệp zip gồm nhiều tệp hình ảnh. Tôi đã thành công trong việc tạo ra các tập tin zip của tất cả các hình ảnh nhưng bằng cách nào đó tất cả các hình ảnh đã được treo cổ để 950 byte. Tôi không biết những gì đang xảy ra ở đây và bây giờ tôi không thể mở các hình ảnh được nén vào tập tin zip đó.Cách tạo tệp zip của nhiều tệp hình ảnh

Đây là mã của tôi. Bất cứ ai có thể cho tôi biết những gì đang xảy ra ở đây?

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

Trả lời

9

Thay đổi này:

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

này:

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

Và thiết lập kích thước bộ đệm 1024 byte:

b=new byte[1024]; 
+0

cảm ơn nó hoạt động rất tốt Bạn đã giải quyết được vấn đề cảm ơn bro nhờ rất nhiều ....: D –

+1

nếu bạn nghĩ câu trả lời này là thích hợp, chấp nhận nó. cùng áp dụng cho tất cả các câu hỏi mà bạn đã yêu cầu trong quá khứ – hoaz

14

Đây là chức năng zip của tôi, tôi luôn luôn sử dụng đối với bất kỳ cấu trúc tệp nào:

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; 
} 
+0

Cảm ơn cho mẫu này hoạt động tốt, ngoại trừ việc tôi phải thay đổi dòng này: FileInputStream in = new FileInputStream (files.get (i) .getCanonicalName()); –

+0

Xin chào - bạn nói đúng, để giữ cấu trúc thư mục, tốt hơn là nên sử dụng * .getCanonicalName() Tôi đã thích nghi điều đó với câu trả lời của tôi - cảm ơn bạn. – salocinx

+0

Xin chào. Tôi tự hỏi (i) lý do tại sao chúng tôi không xóa bộ đệm sau khi tuyên bố out.write, sẽ không đệm bị tràn? (ii) kích thước bộ đệm nói chung là gì đối với kích thước của các tệp nhỏ hơn 1 MB? –