2013-07-29 17 views
5

Ben bir InputStream bir InputStream sıkıştırmak yapmak ve geri dönmek için çalışıyorum:Zipping inputStream, InputStream dönen (hafızada hiçbir dosyası)

public InputStream compress (InputStream in){ 
    // Read "in" and write to ZipOutputStream 
    // Convert ZipOutputStream into InputStream and return 
} 

I (ben GZIP kullanabilirsiniz) ama yapacak bir dosya sıkıştırma am gelecekte daha fazla (bu yüzden ZIP için tercih ettim). Yerlerden en:

Benim (!) sorunlar:

  1. Bu tür yöntemler yoksa ZipOutPutStream öğesini InputStream biçimine nasıl dönüştürebilirim?

  2. ZipOutPutStream() dosyasını oluştururken, varsayılan kurucu yoktur. Yeni bir ZipOutputStrem (yeni OutputStream()) oluşturmalı mıyım?

+0

[Bu] (http://www.javaworld.com/community/node/8362) yardımcı olmalıdır. –

+0

Teşekkürler Boris Örümcek, ancak bu sadece biliyorum ZIP dosyaları ile işlemi gösterir. Bazı temel Java I/OI düşüncesini özlüyorum, onları sıkıştırmaya değil – user1156544

cevap

5

böyle bir şey geçen burada

  • aynı bir .toByteArray() sahip bir ByteArrayOutputStream ile çözüldü:

    private InputStream compress(InputStream in, String entryName) throws IOException { 
         final int BUFFER = 2048; 
         byte buffer[] = new byte[BUFFER]; 
         ByteArrayOutputStream out = new ByteArrayOutputStream(); 
         ZipOutputStream zos = new ZipOutputStream(out); 
         zos.putNextEntry(new ZipEntry(entryName)); 
         int length; 
         while ((length = in.read(buffer)) >= 0) { 
          zos.write(buffer, 0, length); 
         } 
         zos.closeEntry(); 
         zos.close(); 
         return new ByteArrayInputStream(out.toByteArray()); 
    } 
    
  • +1

    Sadece küçük bir not: while deyiminde in.read (buffer)> = 0 olup olmadığını kontrol etmelisiniz. Çünkü inputstream hazır değilse okunan 0 bayt dönebilir, ancak sonuna ulaşılamıyor, akış daha sonra hazır olabilir. Yani bitene kadar bitmiş sayılmamalıdır. –