Java:如何将 InputStream 转换为 GZIPInputStream?

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

我想把inputStream转换成zipInputStream,有什么办法吗?

  • 上述方法不正确并抛出“不是 Zip 格式”的异常

转换 Java Streams 对我来说真的很困惑,我没有把它们做对

最佳答案

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

如果你使用ByteArrayOutputStream,你可以得到一个新的InputStream。将压缩后的内容写入 byte[]ByteArrayInputStreambyte[] 转换为 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/FileInputStreamFile#createTempFile() 创建,尤其是当这些流可能包含大量数据时,这些数据在并发使用时可能会溢出机器的可用内存。

关于Java:如何将 InputStream 转换为 GZIPInputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12322073/

相关文章:

java - 如何使用 GZIPInputStream 修复 EOF 读取错误

java - 如何在 JSP (Struts2) 中访问动态属性

Java方法同步和数据库读写

java - 为ServletResponce指定InputStream,而不是在OutputStream中复制InputStream

java - 如何从 GZIP 数据的 InputStream 中获取解压缩数据的 InputStream?

java - 处理来自 s3 的大文件,没有内存问题

java - NetBeans 中 GUI 之前的 JOptionPane

java - 编译后的程序在第一个 "for"循环处停止

java - 如何将实时数据(数字)传输到 Android 应用程序?

java - 图像到字节数组到字符串(反之亦然)