2013-07-29 31 views
5

Tôi cố gắng để làm nén một InputStream và trả về một InputStream:Nén InputStream, trở về InputStream (trong bộ nhớ, không có tập tin)

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

Tôi nén một tập tin (vì vậy tôi có thể sử dụng GZIP) nhưng sẽ làm nhiều hơn trong tương lai (vì vậy tôi đã chọn ZIP). Trong hầu hết các nơi:

của tôi (!) vấn đề là:

  1. Làm cách nào để chuyển đổi ZipOutPutStream thành InputStream nếu các phương thức như vậy không tồn tại?

  2. Khi tạo tệp ZipOutPutStream() không có hàm tạo mặc định. Tôi có nên tạo một ZipOutputStrem mới (new OutputStream()) không ??

+0

[này] (http://www.javaworld.com/community/node/8362) sẽ giúp ích. –

+0

Cảm ơn Boris the Spider, nhưng điều đó chỉ cho thấy hoạt động với các tệp ZIP mà tôi biết. Tôi đang thiếu một số Java I/OI cơ bản nghĩ, không phải làm thế nào để nén chúng – user1156544

Trả lời

1
  1. Giải quyết nó với một ByteArrayOutputStream trong đó có một .toByteArray()
  2. Cùng ở đây, đi qua các yếu tố nói trên
5

Something như thế:

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

Chỉ cần một lưu ý nhỏ: Trong câu lệnh while, bạn nên kiểm tra xem in.read (buffer)> = 0. Bởi vì nếu inputstream chưa sẵn sàng, nó có thể trả về 0 byte đã đọc, nhưng kết thúc không đạt được, luồng có thể đã sẵn sàng sau đó. Vì vậy, nó không nên được coi là hoàn thành cho đến khi nó trả về -1 –

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