Java的:如何转换的InputStream GZIPInputStream?(Java: How

2019-07-31 10:59发布

我有这样的方法

      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);
        }

我婉转换inputStreamzipInputStream ,什么是做到这一点的呢?

  • 上述方法是不正确的抛出异常为“未ZIP格式”

将Java流对我来说真的很困惑,我不使他们的权利

Answer 1:

GZIPInputStream是用来解压缩传入InputStream 。 要压缩传入InputStream使用GZIP,基本上你需要将它写入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);
    }

    // ...

必要时,可以更换ByteArrayOutputStream / ByteArrayInputStream一个FileOuputStream / FileInputStream上的临时文件,通过创建File#createTempFile()特别是如果这些数据流可以包括同时使用时可能溢出机的可用内存大的数据。



Answer 2:

GZIPInputStream是读书用gzip内容进行编码。

如果你的目标是采取常规的输入流,并在gzip格式压缩它,那么你需要将这些字节写入GZIPOutputStream 。

又见这个回答一个相关的问题 。



文章来源: Java: How do I convert InputStream to GZIPInputStream?