压缩InputStream,返回InputStream(在内存中,没有文件)

use*_*544 10 java zip

我试图压缩一个InputStream并返回一个InputStream:

public InputStream compress (InputStream in){
  // Read "in" and write to ZipOutputStream
  // Convert ZipOutputStream into InputStream and return
}
Run Code Online (Sandbox Code Playgroud)

我正在压缩一个文件(所以我可以使用GZIP),但将来会做更多的事情(所以我选择了ZIP).在大多数地方:

我的问题是:

  1. 如果不存在这样的方法,如何将ZipOutPutStream转换为InputStream?

  2. 创建ZipOutPutStream()时,没有默认构造函数.我应该创建一个新的ZipOutputStrem(new OutputStream())??

小智 10

像这样的东西:

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());
}
Run Code Online (Sandbox Code Playgroud)

  • 只是一个小注释:在while语句中,你应该检查in.read(buffer)> = 0.因为如果输入流没有准备好,它可能会返回0字节读取,但是没有到达结束,流可能会在以后准备好.因此,在返回-1之前不应将其视为已完成 (3认同)

use*_*544 2

  1. 使用具有 .toByteArray() 的 ByteArrayOutputStream 解决了这个问题
  2. 此处相同,传递上述元素