2013-08-23 28 views
6

Tôi đã tạo nhiều BufferedImages trong bộ nhớ và tôi muốn nén chúng thành một tệp zip trước khi gửi nó dưới dạng tệp đính kèm email. Làm cách nào để lưu tệp vào zip mà không đọc tệp từ đĩa.Làm cách nào để tạo tệp zip mà không lưu vào đĩa bằng Java?

Có cách nào để tôi có thể nén các tệp đó mà không tạo tệp tạm thời không?

Ghi vào đĩa mất nhiều thời gian do hàng nghìn tệp được tạo.

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package cccprog; 

import java.awt.Component; 
import java.awt.Panel; 
import java.awt.event.KeyEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JRadioButton; 

/** 
* 
* @author Z 
*/ 
public class N { 

    public static void main(String[] args) throws Exception { 
     for (int i = 0; i < 10; i++) { 
      JFrame jf = new JFrame(); 
      Panel a = new Panel(); 

      JRadioButton birdButton = new JRadioButton(); 
      birdButton.setSize(100, 100); 

      birdButton.setSelected(true); 
      jf.add(birdButton); 

      getSaveSnapShot(birdButton, i + ".bmp"); 

     } 
    } 

    public static BufferedImage getScreenShot(Component component) { 

     BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_BYTE_GRAY); 
     // paints into image's Graphics 
     component.paint(image.getGraphics()); 
     return image; 
    } 

    public static void getSaveSnapShot(Component component, String fileName) throws Exception { 
     BufferedImage img = getScreenShot(component); 
//  BufferedImage img = new BufferedImage(image.getWidth(),image.getHeight(),BufferedImage.TYPE_BYTE_BINARY); 

     // write the captured image as a bmp 
     ImageIO.write(img, "bmp", new File(fileName)); 
    } 
} 
+3

Xem java.utli.zip. –

+1

Chỉ vì sự tò mò của tôi, tại sao bạn muốn tránh tạo một tệp tạm thời? –

+0

Điều này dường như có liên quan http://stackoverflow.com/questions/7108035/how-to-flush-the-zipoutputstream-periodically-in-java – Ted

Trả lời

9

Tôi không chắc chắn về trường hợp sử dụng bạn đang gặp phải ở đây, nếu bạn có hàng nghìn tệp trong bộ nhớ, bạn có thể hết bộ nhớ khá nhanh. Tuy nhiên, các tệp zip thường được tạo bằng luồng, vì vậy không cần tạm thời lưu trữ chúng trong một tệp - cũng có thể trong bộ nhớ hoặc được phát trực tiếp tới người nhận từ xa (chỉ với bộ đệm nhỏ để tránh một bộ đệm). bộ nhớ lớn).

Tôi đã tìm thấy một tiện ích zip cũ được viết cách đây nhiều năm và đã sửa đổi nó một chút cho trường hợp sử dụng của bạn. Nó tạo ra một tập tin zip được lưu trữ trong một mảng byte từ một danh sách các tập tin, cũng được lưu trữ trong mảng byte. Vì bạn có rất nhiều tệp được biểu diễn trong bộ nhớ, tôi đã thêm một lớp trợ giúp nhỏ MemoryFile chỉ với tên tệp và một mảng byte chứa nội dung. Oh, và tôi đã làm cho các lĩnh vực công khai để tránh những thứ getter/setter boilerplate - chỉ để tiết kiệm một số không gian ở đây tất nhiên.

public class MyZip { 

    public static class MemoryFile { 
     public String fileName; 
     public byte[] contents; 
    } 

    public byte[] createZipByteArray(List<MemoryFile> memoryFiles) throws IOException { 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
     ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream); 
     try { 
      for (MemoryFile memoryFile : memoryFiles) { 
       ZipEntry zipEntry = new ZipEntry(memoryFile.fileName); 
       zipOutputStream.putNextEntry(zipEntry); 
       zipOutputStream.write(memoryFile.contents); 
       zipOutputStream.closeEntry(); 
      } 
     } finally { 
      zipOutputStream.close(); 
     } 
     return byteArrayOutputStream.toByteArray(); 
    } 

} 
+0

Tôi đã cập nhật bài đăng gốc của mình. Tôi đã nhầm lẫn làm thế nào một BufferImage có thể được sử dụng để làm như vậy. – user1198289

+0

Bạn không chỉ "cập nhật" bài đăng gốc của mình, bạn đã hoàn toàn thay đổi nó. Tôi không quá ngây thơ về điều đó; tức là câu hỏi được thay đổi hoàn toàn sau khi tôi đã dành thời gian trả lời câu hỏi đó. Bạn nên biết rằng có "hàng nghìn" tệp PDF trong bộ nhớ và hàng nghìn BufferedImages là hai thứ khác nhau. Đối với mỗi hình ảnh, bạn sẽ cần thu được luồng đầu ra theo định dạng (gif, png, jpg, v.v.) mà bạn muốn lưu/chuyển chúng. Cũng lưu ý rằng hình ảnh nén có ít ảnh hưởng về nén, vì chúng thường được nén. – Steinar

1
   FileInputStream[] ins = //I assume you have all file handles in the form of FileInputStream 
      String[] fileNames = //I assume you have all file names 
      FileOutputStream out = new FileOutputStream(""); //specify the zip file name here 
      ZipOutputStream zipOut = new ZipOutputStream(out); 
      for (int i=0; i<ins.length; i++) { 
       ZipEntry entry = new ZipEntry(fileNames[i]); 
       zipOut.putNextEntry(entry); 
       int number = 0; 
       byte[] buffer = new byte[512]; 
       while ((number = ins[i].read(buffer)) != -1) { 
        zipOut.write(buffer, 0, number); 
       }       
       ins[i].close(); 
      } 
      out.close(); 
      zipOut.close(); 

Dựa trên những thông tin mà bạn đã cung cấp, tôi đến với các mã trên. Hi vọng điêu nay co ich.

+0

Tôi đã cập nhật bài đăng gốc của mình. Tôi đã nhầm lẫn làm thế nào một BufferImage có thể được sử dụng để làm như vậy. – user1198289

Các vấn đề liên quan