2013-07-29 8 views
5

Próbuję zrobić skompresować InputStream i powrócić InputStream:Zipping InputStream, wracając InputStream (w pamięci, brak pliku)

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

ja kompresji jednego pliku (więc mogę użyć GZIP), ale zrobi więcej w przyszłości (dlatego wybrałem ZIP). W większości miejsc:

My (!) Problemy są następujące:

  1. Jak przekonwertować ZipOutPutStream na InputStream, jeśli takie metody nie istnieją?

  2. Podczas tworzenia ZipOutPutStream() nie ma domyślnego konstruktora. Czy powinienem utworzyć nowy ZipOutputStrem (new OutputStream())?

+0

[to] (http://www.javaworld.com/community/node/8362) powinny pomóc. –

+0

Dzięki Boris the Spider, ale to pokazuje operację tylko z plikami ZIP, które znam. Brakuje mi podstawowych Java I/OI, myślę, nie jak je kompresować. – user1156544

Odpowiedz

1
  1. rozwiązany z ByteArrayOutputStream który ma .toByteArray()
  2. samo jest tutaj, przechodząc wyżej wymienionych elementowi
5

Coś podobnego:

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

Tylko mała uwaga: w instrukcji while powinieneś sprawdzić czy in.read (buffer)> = 0. Ponieważ jeśli inputstream nie jest gotowy, może zwrócić 0 bajtów do odczytu, ale koniec nie zostanie osiągnięty, strumień może być gotowy później. Więc nie powinno być uważane za zakończone, dopóki nie zwróci -1 –