2013-08-23 15 views
6

Bellekte birçok BufferedImages ürettim ve bunları bir e-posta eki olarak göndermeden önce bir zip dosyasına sıkıştırmak istiyorum. Dosyaları diskten okumadan bir zip dosyasına nasıl kaydederim.Java ile diske kaydetmeden zip dosyasını nasıl oluşturabilirim?

Bu dosyaları geçici dosya oluşturmadan sıkıştırabilmemin bir yolu var mı?

Oluşturmak binlerce dosya nedeniyle disk yazma zaman alır.

/* 
* 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

java.utli.zip dosyasına bakın. –

+1

Sadece merakım için, neden geçici dosya oluşturmaktan kaçınmak istiyorsunuz? –

+0

Bu, http://stackoverflow.com/questions/7108035/how-to-flush-the-zipoutputstream-periodically-in-java – Ted

cevap

9

Ben size oldukça hızlı bellek tükeneceğini bellekte binlerce dosya varsa, burada yaşıyorsanız kullanım örneği konusunda emin değilim.

Ancak, zip dosyaları genellikle akışlar ile üretilir, bu nedenle bunları bir dosyaya geçici olarak depolamaya gerek yoktur - bellekte olduğu gibi veya doğrudan uzak bir alıcıya da aktarılabilir (yalnızca küçük bir bellek arabelleğiyle). büyük bellek izi).

Eski bir zip aracını yıllar önce yazdım ve kullanım durumunuz için biraz değiştirdim. Bayt dizilerinde saklanan dosyaların bir listesinden bir bayt dizisinde saklanan bir zip dosyası oluşturur. Bellekte çok fazla dosya bulunduğundan, sadece dosya adı ve içeriğini içeren bir bayt dizisi ile küçük bir yardımcı sınıf MemoryFile ekledim. Oh, ve ben kazanım-setter şeylerden kaçınmak için alanları kamusal hale getirdim - sadece burada biraz yer kazanmak için.

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

Orijinal yayımı güncelledim. Bir BufferImage'ın aynısını yapmak için nasıl kullanılabileceği konusunda kafam karışmıştı. – user1198289

+0

Sadece orijinal yayınınızı "güncellemediniz", tamamen değiştirdiniz. Ben buna aşırı düşkün değilim; Yani soruya cevap verdikten sonra soru tamamen değişti. Bellekte "binlerce" olan belleğe ve binlerce BufferedImages'ye sahip olmanın iki farklı şey olduğunun farkında olmalısınız. Her bir görüntü için, bunları kaydetmek/aktarmak istediğiniz formatta (gif, png, jpg vb.) Bir çıkış akışı elde etmeniz gerekir. Ayrıca, sıkıştırma resimlerinin sıkıştırma açısından çok az etkisi olduğunu unutmayın. Genellikle zaten sıkıştırılmışlardır. – 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(); 

Verdiğiniz bilgilere dayanarak, yukarıdaki kod ile gelip. Bu yardımcı olur umarım.

+0

Orijinal yayımı güncelledim. Bir BufferImage'ın aynısını yapmak için nasıl kullanılabileceği konusunda kafam karışmıştı. – user1198289

İlgili konular