如何解压缩字节数组中的 gzip 数据?

发布于 2024-07-09 04:47:27 字数 588 浏览 9 评论 0原文

我有一个类,它有一个接收对象作为参数的方法。 该方法通过 RMI 调用。

public RMIClass extends Serializable {
    public RMIMethod(MyFile file){
        // do stuff
    }
}

MyFile 有一个名为“body”的属性,它是一个字节数组。

public final class MyFile implements Serializable {

    private byte[] body = new byte[0];
    //.... 

    public byte[] getBody() {
        return body;
    }
    //....
}

此属性保存由另一个应用程序解析的文件的 gzip 数据。

我需要先解压缩这个字节数组,然后再对其执行进一步的操作。

我看到的所有解压缩 gzip 数据的示例都假设我想将其写入磁盘并创建物理文件,但我不想这样做。

我该怎么做呢?

提前致谢。

I have a class which has a method that is receiving an object as a parameter.
This method is invoked via RMI.

public RMIClass extends Serializable {
    public RMIMethod(MyFile file){
        // do stuff
    }
}

MyFile has a property called "body", which is a byte array.

public final class MyFile implements Serializable {

    private byte[] body = new byte[0];
    //.... 

    public byte[] getBody() {
        return body;
    }
    //....
}

This property holds the gzipped data of a file that was parsed by another application.

I need to decompress this byte array before performing further actions with it.

All the examples I see of decompressing gzipped data assume that I want to write it to the disk and create a physical file, which I do not.

How do I do this?

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

那小子欠揍 2024-07-16 04:47:27

使用 ByteArrayInputStream 包装字节数组并提供将其放入 GZipInputStream

Wrap your byte array with a ByteArrayInputStream and feed it into a GZipInputStream

仙女 2024-07-16 04:47:27

JDK 9+

  private byte[] gzipUncompress(byte[] compressedBytes) throws IOException {
    try (InputStream inputStream = new GZIPInputStream(new ByteArrayInputStream(compressedBytes))) {
      try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
        inputStream.transferTo(outputStream);
        return outputStream.toByteArray();
      }
    }

}

JDK 9+

  private byte[] gzipUncompress(byte[] compressedBytes) throws IOException {
    try (InputStream inputStream = new GZIPInputStream(new ByteArrayInputStream(compressedBytes))) {
      try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
        inputStream.transferTo(outputStream);
        return outputStream.toByteArray();
      }
    }

}

乖乖 2024-07-16 04:47:27

查看这些示例,无论它们在哪里使用 FileOutputStream,请改用 ByteArrayOutputStream。 无论他们在哪里使用 FileInputStream,请改用 ByteArrayInputStream。 其余的应该很简单。

Look at those samples, and wherever they're using FileOutputStream, use ByteArrayOutputStream instead. Wherever they're using FileInputStream, use ByteArrayInputStream instead. The rest should be simple.

绾颜 2024-07-16 04:47:27

为什么不创建自己的类来扩展 OutputStream 或 ,无论存档写入什么内容?

Why don't you create your own class that extends OutputStream or , whatever is the archive writing to ?

不忘初心 2024-07-16 04:47:27

如果你想写入 ByteBuffer,你可以这样做。

private static void uncompress(final byte[] input, final ByteBuffer output) throws IOException
    {
        final GZIPInputStream inputGzipStream = new GZIPInputStream(new ByteArrayInputStream(input));
        Channels.newChannel(inputGzipStream).read(output);
    }

If you want to write to a ByteBuffer you can do this.

private static void uncompress(final byte[] input, final ByteBuffer output) throws IOException
    {
        final GZIPInputStream inputGzipStream = new GZIPInputStream(new ByteArrayInputStream(input));
        Channels.newChannel(inputGzipStream).read(output);
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文