Java:如何将InputStream转换为GZIPInputStream?

day*_*mer 5 java inputstream gzipinputstream

我有一个方法

      public void put(@Nonnull final InputStream inputStream, @Nonnull final String uniqueId) throws PersistenceException {
        // a.) create gzip of inputStream
        final GZIPInputStream zipInputStream;
        try {
            zipInputStream = new GZIPInputStream(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
            throw new PersistenceException("Persistence Service could not received input stream to persist for " + uniqueId);
        }
Run Code Online (Sandbox Code Playgroud)

我想转换inputStreamzipInputStream,这样做的方法是什么?

  • 上面的方法不正确,并抛出异常为"不是Zip格式"

将Java Streams转换为我真的很混乱,我没有让它们正确

Bal*_*usC 11

GZIPInputStream是将用于解压缩的传入InputStream.要InputStream使用GZIP 压缩传入,您基本上需要将其写入a GZIPOutputStream.

你可以得到一个新的InputStream出来的,如果你用ByteArrayOutputStream写gzip压缩内容到byte[]ByteArrayInputStream把一个byte[]成一个InputStream.

所以,基本上:

public void put(@Nonnull final InputStream inputStream, @Nonnull final String uniqueId) throws PersistenceException {
    final InputStream zipInputStream;
    try {
        ByteArrayOutputStream bytesOutput = new ByteArrayOutputStream();
        GZIPOutputStream gzipOutput = new GZIPOutputStream(bytesOutput);

        try {
            byte[] buffer = new byte[10240];
            for (int length = 0; (length = inputStream.read(buffer)) != -1;) {
                gzipOutput.write(buffer, 0, length);
            }
        } finally {
            try { inputStream.close(); } catch (IOException ignore) {}
            try { gzipOutput.close(); } catch (IOException ignore) {}
        }

        zipInputStream = new ByteArrayInputStream(bytesOutput.toByteArray());
    } catch (IOException e) {
        e.printStackTrace();
        throw new PersistenceException("Persistence Service could not received input stream to persist for " + uniqueId);
    }

    // ...
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以将ByteArrayOutputStream/ 替换ByteArrayInputStream为由创建的临时文件上的FileOuputStream/ ,特别是如果这些流可以包含大数据,这些数据可能会在并发使用时溢出计算机的可用内存.FileInputStreamFile#createTempFile()


mat*_*t b 5

GZIPInputStream用于读取 gzip编码内容.

如果你的目标是采用常规输入流并以GZIP格式压缩它,那么你需要将这些字节写入GZIPOutputStream.

另见相关问题的答案.